| 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 "media/base/key_systems.h" | 5 #include "media/base/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" |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 153 // True is always returned for a |key_system| that begins with "x-". | 153 // True is always returned for a |key_system| that begins with "x-". |
| 154 // | 154 // |
| 155 // As with other web platform features, advertising support for a key system | 155 // As with other web platform features, advertising support for a key system |
| 156 // implies that it adheres to a defined and interoperable specification. | 156 // implies that it adheres to a defined and interoperable specification. |
| 157 // | 157 // |
| 158 // To ensure interoperability, implementations of a specific |key_system| string | 158 // To ensure interoperability, implementations of a specific |key_system| string |
| 159 // must conform to a specification for that identifier that defines | 159 // must conform to a specification for that identifier that defines |
| 160 // key system-specific behaviors not fully defined by the EME specification. | 160 // key system-specific behaviors not fully defined by the EME specification. |
| 161 // That specification should be provided by the owner of the domain that is the | 161 // That specification should be provided by the owner of the domain that is the |
| 162 // reverse of the |key_system| string. | 162 // reverse of the |key_system| string. |
| 163 // This involves more than calling a library, SDK, or platform API. KeySystems | 163 // This involves more than calling a library, SDK, or platform API. |
| 164 // must be populated appropriately, and there will likely be glue code to adapt | 164 // KeySystemsImpl must be populated appropriately, and there will likely be glue |
| 165 // to the API of the library, SDK, or platform API. | 165 // code to adapt to the API of the library, SDK, or platform API. |
| 166 // | 166 // |
| 167 // Chromium mainline contains this data and glue code for specific key systems, | 167 // Chromium mainline contains this data and glue code for specific key systems, |
| 168 // which should help ensure interoperability with other implementations using | 168 // which should help ensure interoperability with other implementations using |
| 169 // these key systems. | 169 // these key systems. |
| 170 // | 170 // |
| 171 // If you need to add support for other key systems, ensure that you have | 171 // If you need to add support for other key systems, ensure that you have |
| 172 // obtained the specification for how to integrate it with EME, implemented the | 172 // obtained the specification for how to integrate it with EME, implemented the |
| 173 // appropriate glue/adapter code, and added all the appropriate data to | 173 // appropriate glue/adapter code, and added all the appropriate data to |
| 174 // KeySystems. Only then should you change this function. | 174 // KeySystemsImpl. Only then should you change this function. |
| 175 static bool IsPotentiallySupportedKeySystem(const std::string& key_system) { | 175 static bool IsPotentiallySupportedKeySystem(const std::string& key_system) { |
| 176 // Known and supported key systems. | 176 // Known and supported key systems. |
| 177 if (key_system == kWidevineKeySystem) | 177 if (key_system == kWidevineKeySystem) |
| 178 return true; | 178 return true; |
| 179 if (key_system == kClearKey) | 179 if (key_system == kClearKey) |
| 180 return true; | 180 return true; |
| 181 | 181 |
| 182 // External Clear Key is known and supports suffixes for testing. | 182 // External Clear Key is known and supports suffixes for testing. |
| 183 if (IsExternalClearKey(key_system)) | 183 if (IsExternalClearKey(key_system)) |
| 184 return true; | 184 return true; |
| 185 | 185 |
| 186 // Chromecast defines behaviors for Cast clients within its reverse domain. | 186 // Chromecast defines behaviors for Cast clients within its reverse domain. |
| 187 const char kChromecastRoot[] = "com.chromecast"; | 187 const char kChromecastRoot[] = "com.chromecast"; |
| 188 if (IsParentKeySystemOf(kChromecastRoot, key_system)) | 188 if (IsParentKeySystemOf(kChromecastRoot, key_system)) |
| 189 return true; | 189 return true; |
| 190 | 190 |
| 191 // Implementations that do not have a specification or appropriate glue code | 191 // Implementations that do not have a specification or appropriate glue code |
| 192 // can use the "x-" prefix to avoid conflicting with and advertising support | 192 // can use the "x-" prefix to avoid conflicting with and advertising support |
| 193 // for real key system names. Use is discouraged. | 193 // for real key system names. Use is discouraged. |
| 194 const char kExcludedPrefix[] = "x-"; | 194 const char kExcludedPrefix[] = "x-"; |
| 195 if (key_system.find(kExcludedPrefix, 0, arraysize(kExcludedPrefix) - 1) == 0) | 195 if (key_system.find(kExcludedPrefix, 0, arraysize(kExcludedPrefix) - 1) == 0) |
| 196 return true; | 196 return true; |
| 197 | 197 |
| 198 return false; | 198 return false; |
| 199 } | 199 } |
| 200 | 200 |
| 201 class KeySystems { | 201 class KeySystemsImpl : public KeySystems { |
| 202 public: | 202 public: |
| 203 static KeySystems& GetInstance(); | 203 static KeySystemsImpl& GetInstance(); |
| 204 | 204 |
| 205 void UpdateIfNeeded(); | 205 void UpdateIfNeeded(); |
| 206 | 206 |
| 207 bool IsConcreteSupportedKeySystem(const std::string& key_system); | 207 bool IsConcreteSupportedKeySystem(const std::string& key_system) const; |
| 208 | |
| 209 bool IsSupportedKeySystem(const std::string& key_system); | |
| 210 | 208 |
| 211 bool IsSupportedKeySystemWithInitDataType( | 209 bool IsSupportedKeySystemWithInitDataType( |
| 212 const std::string& key_system, | 210 const std::string& key_system, |
| 213 const std::string& init_data_type); | 211 const std::string& init_data_type) const; |
| 212 |
| 213 bool PrefixedIsSupportedKeySystemWithMediaMimeType( |
| 214 const std::string& mime_type, |
| 215 const std::vector<std::string>& codecs, |
| 216 const std::string& key_system); |
| 214 | 217 |
| 215 bool IsSupportedKeySystemWithMediaMimeType( | 218 bool IsSupportedKeySystemWithMediaMimeType( |
| 216 const std::string& mime_type, | 219 const std::string& mime_type, |
| 217 const std::vector<std::string>& codecs, | 220 const std::vector<std::string>& codecs, |
| 218 const std::string& key_system, | 221 const std::string& key_system) const; |
| 219 bool is_prefixed); | |
| 220 | 222 |
| 221 std::string GetKeySystemNameForUMA(const std::string& key_system) const; | 223 std::string GetKeySystemNameForUMA(const std::string& key_system) const; |
| 222 | 224 |
| 223 bool UseAesDecryptor(const std::string& concrete_key_system); | 225 bool UseAesDecryptor(const std::string& concrete_key_system) const; |
| 224 | 226 |
| 225 #if defined(ENABLE_PEPPER_CDMS) | 227 #if defined(ENABLE_PEPPER_CDMS) |
| 226 std::string GetPepperType(const std::string& concrete_key_system); | 228 std::string GetPepperType(const std::string& concrete_key_system) const; |
| 227 #endif | 229 #endif |
| 228 | 230 |
| 231 void AddContainerMask(const std::string& container, uint32 mask); |
| 232 void AddCodecMask(const std::string& codec, uint32 mask); |
| 233 |
| 234 // Implementation of KeySystems interface. |
| 235 bool IsSupportedKeySystem(const std::string& key_system) const override; |
| 236 |
| 237 bool IsSupportedCodecCombination( |
| 238 const std::string& key_system, |
| 239 EmeMediaType media_type, |
| 240 const std::string& container_mime_type, |
| 241 const std::vector<std::string>& codecs) const override; |
| 242 |
| 229 EmeConfigRule GetRobustnessConfigRule( | 243 EmeConfigRule GetRobustnessConfigRule( |
| 230 const std::string& key_system, | 244 const std::string& key_system, |
| 231 EmeMediaType media_type, | 245 EmeMediaType media_type, |
| 232 const std::string& requested_robustness); | 246 const std::string& requested_robustness) const override; |
| 233 | 247 |
| 234 EmeConfigRule GetPersistentLicenseSessionConfigRule( | 248 EmeConfigRule GetPersistentLicenseSessionConfigRule( |
| 235 const std::string& key_system); | 249 const std::string& key_system) const override; |
| 236 | 250 |
| 237 EmeConfigRule GetPersistentReleaseMessageSessionConfigRule( | 251 EmeConfigRule GetPersistentReleaseMessageSessionConfigRule( |
| 238 const std::string& key_system); | 252 const std::string& key_system) const override; |
| 239 | 253 |
| 240 EmeConfigRule GetPersistentStateConfigRule( | 254 EmeConfigRule GetPersistentStateConfigRule( |
| 241 const std::string& key_system, | 255 const std::string& key_system, |
| 242 EmeFeatureRequirement requirement); | 256 EmeFeatureRequirement requirement) const override; |
| 243 | 257 |
| 244 EmeConfigRule GetDistinctiveIdentifierConfigRule( | 258 EmeConfigRule GetDistinctiveIdentifierConfigRule( |
| 245 const std::string& key_system, | 259 const std::string& key_system, |
| 246 EmeFeatureRequirement requirement); | 260 EmeFeatureRequirement requirement) const override; |
| 247 | |
| 248 void AddContainerMask(const std::string& container, uint32 mask); | |
| 249 void AddCodecMask(const std::string& codec, uint32 mask); | |
| 250 | 261 |
| 251 private: | 262 private: |
| 252 void InitializeUMAInfo(); | 263 void InitializeUMAInfo(); |
| 253 | 264 |
| 254 void UpdateSupportedKeySystems(); | 265 void UpdateSupportedKeySystems(); |
| 255 | 266 |
| 256 void AddConcreteSupportedKeySystems( | 267 void AddConcreteSupportedKeySystems( |
| 257 const std::vector<KeySystemInfo>& concrete_key_systems); | 268 const std::vector<KeySystemInfo>& concrete_key_systems); |
| 258 | 269 |
| 259 friend struct base::DefaultLazyInstanceTraits<KeySystems>; | 270 friend struct base::DefaultLazyInstanceTraits<KeySystemsImpl>; |
| 260 | 271 |
| 261 typedef base::hash_map<std::string, KeySystemInfo> KeySystemInfoMap; | 272 typedef base::hash_map<std::string, KeySystemInfo> KeySystemInfoMap; |
| 262 typedef base::hash_map<std::string, std::string> ParentKeySystemMap; | 273 typedef base::hash_map<std::string, std::string> ParentKeySystemMap; |
| 263 typedef base::hash_map<std::string, SupportedCodecs> ContainerCodecsMap; | 274 typedef base::hash_map<std::string, SupportedCodecs> ContainerCodecsMap; |
| 264 typedef base::hash_map<std::string, EmeCodec> CodecsMap; | 275 typedef base::hash_map<std::string, EmeCodec> CodecsMap; |
| 265 typedef base::hash_map<std::string, EmeInitDataType> InitDataTypesMap; | 276 typedef base::hash_map<std::string, EmeInitDataType> InitDataTypesMap; |
| 266 typedef base::hash_map<std::string, std::string> KeySystemNameForUMAMap; | 277 typedef base::hash_map<std::string, std::string> KeySystemNameForUMAMap; |
| 267 | 278 |
| 268 KeySystems(); | 279 KeySystemsImpl(); |
| 269 ~KeySystems() {} | 280 ~KeySystemsImpl() {} |
| 270 | 281 |
| 271 EmeInitDataType GetInitDataTypeForName( | 282 EmeInitDataType GetInitDataTypeForName( |
| 272 const std::string& init_data_type) const; | 283 const std::string& init_data_type) const; |
| 273 // TODO(sandersd): Separate container enum from codec mask value. | 284 // TODO(sandersd): Separate container enum from codec mask value. |
| 274 // http://crbug.com/417440 | 285 // http://crbug.com/417440 |
| 275 SupportedCodecs GetCodecMaskForContainer( | 286 SupportedCodecs GetCodecMaskForContainer( |
| 276 const std::string& container) const; | 287 const std::string& container) const; |
| 277 EmeCodec GetCodecForString(const std::string& codec) const; | 288 EmeCodec GetCodecForString(const std::string& codec) const; |
| 278 | 289 |
| 279 const std::string& PrefixedGetConcreteKeySystemNameFor( | 290 const std::string& PrefixedGetConcreteKeySystemNameFor( |
| (...skipping 22 matching lines...) Expand all Loading... |
| 302 KeySystemsSupportUMA key_systems_support_uma_; | 313 KeySystemsSupportUMA key_systems_support_uma_; |
| 303 | 314 |
| 304 InitDataTypesMap init_data_type_name_map_; | 315 InitDataTypesMap init_data_type_name_map_; |
| 305 ContainerCodecsMap container_to_codec_mask_map_; | 316 ContainerCodecsMap container_to_codec_mask_map_; |
| 306 CodecsMap codec_string_map_; | 317 CodecsMap codec_string_map_; |
| 307 KeySystemNameForUMAMap key_system_name_for_uma_map_; | 318 KeySystemNameForUMAMap key_system_name_for_uma_map_; |
| 308 | 319 |
| 309 // Makes sure all methods are called from the same thread. | 320 // Makes sure all methods are called from the same thread. |
| 310 base::ThreadChecker thread_checker_; | 321 base::ThreadChecker thread_checker_; |
| 311 | 322 |
| 312 DISALLOW_COPY_AND_ASSIGN(KeySystems); | 323 DISALLOW_COPY_AND_ASSIGN(KeySystemsImpl); |
| 313 }; | 324 }; |
| 314 | 325 |
| 315 static base::LazyInstance<KeySystems> g_key_systems = LAZY_INSTANCE_INITIALIZER; | 326 static base::LazyInstance<KeySystemsImpl> g_key_systems = |
| 327 LAZY_INSTANCE_INITIALIZER; |
| 316 | 328 |
| 317 KeySystems& KeySystems::GetInstance() { | 329 KeySystemsImpl& KeySystemsImpl::GetInstance() { |
| 318 KeySystems& key_systems = g_key_systems.Get(); | 330 KeySystemsImpl& key_systems = g_key_systems.Get(); |
| 319 key_systems.UpdateIfNeeded(); | 331 key_systems.UpdateIfNeeded(); |
| 320 return key_systems; | 332 return key_systems; |
| 321 } | 333 } |
| 322 | 334 |
| 323 // Because we use a LazyInstance, the key systems info must be populated when | 335 // Because we use a LazyInstance, the key systems info must be populated when |
| 324 // the instance is lazily initiated. | 336 // the instance is lazily initiated. |
| 325 KeySystems::KeySystems() { | 337 KeySystemsImpl::KeySystemsImpl() { |
| 326 for (size_t i = 0; i < arraysize(kInitDataTypeNames); ++i) { | 338 for (size_t i = 0; i < arraysize(kInitDataTypeNames); ++i) { |
| 327 const std::string& name = kInitDataTypeNames[i].name; | 339 const std::string& name = kInitDataTypeNames[i].name; |
| 328 DCHECK(!init_data_type_name_map_.count(name)); | 340 DCHECK(!init_data_type_name_map_.count(name)); |
| 329 init_data_type_name_map_[name] = kInitDataTypeNames[i].type; | 341 init_data_type_name_map_[name] = kInitDataTypeNames[i].type; |
| 330 } | 342 } |
| 331 for (size_t i = 0; i < arraysize(kContainerToCodecMasks); ++i) { | 343 for (size_t i = 0; i < arraysize(kContainerToCodecMasks); ++i) { |
| 332 const std::string& name = kContainerToCodecMasks[i].name; | 344 const std::string& name = kContainerToCodecMasks[i].name; |
| 333 DCHECK(!container_to_codec_mask_map_.count(name)); | 345 DCHECK(!container_to_codec_mask_map_.count(name)); |
| 334 container_to_codec_mask_map_[name] = kContainerToCodecMasks[i].type; | 346 container_to_codec_mask_map_[name] = kContainerToCodecMasks[i].type; |
| 335 } | 347 } |
| 336 for (size_t i = 0; i < arraysize(kCodecStrings); ++i) { | 348 for (size_t i = 0; i < arraysize(kCodecStrings); ++i) { |
| 337 const std::string& name = kCodecStrings[i].name; | 349 const std::string& name = kCodecStrings[i].name; |
| 338 DCHECK(!codec_string_map_.count(name)); | 350 DCHECK(!codec_string_map_.count(name)); |
| 339 codec_string_map_[name] = kCodecStrings[i].type; | 351 codec_string_map_[name] = kCodecStrings[i].type; |
| 340 } | 352 } |
| 341 | 353 |
| 342 InitializeUMAInfo(); | 354 InitializeUMAInfo(); |
| 343 | 355 |
| 344 // Always update supported key systems during construction. | 356 // Always update supported key systems during construction. |
| 345 UpdateSupportedKeySystems(); | 357 UpdateSupportedKeySystems(); |
| 346 } | 358 } |
| 347 | 359 |
| 348 EmeInitDataType KeySystems::GetInitDataTypeForName( | 360 EmeInitDataType KeySystemsImpl::GetInitDataTypeForName( |
| 349 const std::string& init_data_type) const { | 361 const std::string& init_data_type) const { |
| 350 InitDataTypesMap::const_iterator iter = | 362 InitDataTypesMap::const_iterator iter = |
| 351 init_data_type_name_map_.find(init_data_type); | 363 init_data_type_name_map_.find(init_data_type); |
| 352 if (iter != init_data_type_name_map_.end()) | 364 if (iter != init_data_type_name_map_.end()) |
| 353 return iter->second; | 365 return iter->second; |
| 354 return EME_INIT_DATA_TYPE_NONE; | 366 return EME_INIT_DATA_TYPE_NONE; |
| 355 } | 367 } |
| 356 | 368 |
| 357 SupportedCodecs KeySystems::GetCodecMaskForContainer( | 369 SupportedCodecs KeySystemsImpl::GetCodecMaskForContainer( |
| 358 const std::string& container) const { | 370 const std::string& container) const { |
| 359 ContainerCodecsMap::const_iterator iter = | 371 ContainerCodecsMap::const_iterator iter = |
| 360 container_to_codec_mask_map_.find(container); | 372 container_to_codec_mask_map_.find(container); |
| 361 if (iter != container_to_codec_mask_map_.end()) | 373 if (iter != container_to_codec_mask_map_.end()) |
| 362 return iter->second; | 374 return iter->second; |
| 363 return EME_CODEC_NONE; | 375 return EME_CODEC_NONE; |
| 364 } | 376 } |
| 365 | 377 |
| 366 EmeCodec KeySystems::GetCodecForString(const std::string& codec) const { | 378 EmeCodec KeySystemsImpl::GetCodecForString(const std::string& codec) const { |
| 367 CodecsMap::const_iterator iter = codec_string_map_.find(codec); | 379 CodecsMap::const_iterator iter = codec_string_map_.find(codec); |
| 368 if (iter != codec_string_map_.end()) | 380 if (iter != codec_string_map_.end()) |
| 369 return iter->second; | 381 return iter->second; |
| 370 return EME_CODEC_NONE; | 382 return EME_CODEC_NONE; |
| 371 } | 383 } |
| 372 | 384 |
| 373 const std::string& KeySystems::PrefixedGetConcreteKeySystemNameFor( | 385 const std::string& KeySystemsImpl::PrefixedGetConcreteKeySystemNameFor( |
| 374 const std::string& key_system) const { | 386 const std::string& key_system) const { |
| 375 ParentKeySystemMap::const_iterator iter = | 387 ParentKeySystemMap::const_iterator iter = |
| 376 parent_key_system_map_.find(key_system); | 388 parent_key_system_map_.find(key_system); |
| 377 if (iter != parent_key_system_map_.end()) | 389 if (iter != parent_key_system_map_.end()) |
| 378 return iter->second; | 390 return iter->second; |
| 379 return key_system; | 391 return key_system; |
| 380 } | 392 } |
| 381 | 393 |
| 382 void KeySystems::InitializeUMAInfo() { | 394 void KeySystemsImpl::InitializeUMAInfo() { |
| 383 DCHECK(thread_checker_.CalledOnValidThread()); | 395 DCHECK(thread_checker_.CalledOnValidThread()); |
| 384 DCHECK(key_system_name_for_uma_map_.empty()); | 396 DCHECK(key_system_name_for_uma_map_.empty()); |
| 385 | 397 |
| 386 std::vector<KeySystemInfoForUMA> key_systems_info_for_uma; | 398 std::vector<KeySystemInfoForUMA> key_systems_info_for_uma; |
| 387 if (GetMediaClient()) | 399 if (GetMediaClient()) |
| 388 GetMediaClient()->AddKeySystemsInfoForUMA(&key_systems_info_for_uma); | 400 GetMediaClient()->AddKeySystemsInfoForUMA(&key_systems_info_for_uma); |
| 389 | 401 |
| 390 for (const KeySystemInfoForUMA& info : key_systems_info_for_uma) { | 402 for (const KeySystemInfoForUMA& info : key_systems_info_for_uma) { |
| 391 key_system_name_for_uma_map_[info.key_system] = | 403 key_system_name_for_uma_map_[info.key_system] = |
| 392 info.key_system_name_for_uma; | 404 info.key_system_name_for_uma; |
| 393 if (info.reports_key_system_support_to_uma) | 405 if (info.reports_key_system_support_to_uma) |
| 394 key_systems_support_uma_.AddKeySystemToReport(info.key_system); | 406 key_systems_support_uma_.AddKeySystemToReport(info.key_system); |
| 395 } | 407 } |
| 396 | 408 |
| 397 // Clear Key is always supported. | 409 // Clear Key is always supported. |
| 398 key_system_name_for_uma_map_[kClearKeyKeySystem] = | 410 key_system_name_for_uma_map_[kClearKeyKeySystem] = |
| 399 kClearKeyKeySystemNameForUMA; | 411 kClearKeyKeySystemNameForUMA; |
| 400 } | 412 } |
| 401 | 413 |
| 402 void KeySystems::UpdateIfNeeded() { | 414 void KeySystemsImpl::UpdateIfNeeded() { |
| 403 if (GetMediaClient() && GetMediaClient()->IsKeySystemsUpdateNeeded()) | 415 if (GetMediaClient() && GetMediaClient()->IsKeySystemsUpdateNeeded()) |
| 404 UpdateSupportedKeySystems(); | 416 UpdateSupportedKeySystems(); |
| 405 } | 417 } |
| 406 | 418 |
| 407 void KeySystems::UpdateSupportedKeySystems() { | 419 void KeySystemsImpl::UpdateSupportedKeySystems() { |
| 408 DCHECK(thread_checker_.CalledOnValidThread()); | 420 DCHECK(thread_checker_.CalledOnValidThread()); |
| 409 concrete_key_system_map_.clear(); | 421 concrete_key_system_map_.clear(); |
| 410 parent_key_system_map_.clear(); | 422 parent_key_system_map_.clear(); |
| 411 | 423 |
| 412 // Build KeySystemInfo. | 424 // Build KeySystemInfo. |
| 413 std::vector<KeySystemInfo> key_systems_info; | 425 std::vector<KeySystemInfo> key_systems_info; |
| 414 | 426 |
| 415 // Add key systems supported by the MediaClient implementation. | 427 // Add key systems supported by the MediaClient implementation. |
| 416 if (GetMediaClient()) | 428 if (GetMediaClient()) |
| 417 GetMediaClient()->AddSupportedKeySystems(&key_systems_info); | 429 GetMediaClient()->AddSupportedKeySystems(&key_systems_info); |
| 418 | 430 |
| 419 // Clear Key is always supported. | 431 // Clear Key is always supported. |
| 420 AddClearKey(&key_systems_info); | 432 AddClearKey(&key_systems_info); |
| 421 | 433 |
| 422 AddConcreteSupportedKeySystems(key_systems_info); | 434 AddConcreteSupportedKeySystems(key_systems_info); |
| 423 } | 435 } |
| 424 | 436 |
| 425 void KeySystems::AddConcreteSupportedKeySystems( | 437 void KeySystemsImpl::AddConcreteSupportedKeySystems( |
| 426 const std::vector<KeySystemInfo>& concrete_key_systems) { | 438 const std::vector<KeySystemInfo>& concrete_key_systems) { |
| 427 DCHECK(thread_checker_.CalledOnValidThread()); | 439 DCHECK(thread_checker_.CalledOnValidThread()); |
| 428 DCHECK(concrete_key_system_map_.empty()); | 440 DCHECK(concrete_key_system_map_.empty()); |
| 429 DCHECK(parent_key_system_map_.empty()); | 441 DCHECK(parent_key_system_map_.empty()); |
| 430 | 442 |
| 431 for (const KeySystemInfo& info : concrete_key_systems) { | 443 for (const KeySystemInfo& info : concrete_key_systems) { |
| 432 DCHECK(!info.key_system.empty()); | 444 DCHECK(!info.key_system.empty()); |
| 433 DCHECK(info.max_audio_robustness != EmeRobustness::INVALID); | 445 DCHECK(info.max_audio_robustness != EmeRobustness::INVALID); |
| 434 DCHECK(info.max_video_robustness != EmeRobustness::INVALID); | 446 DCHECK(info.max_video_robustness != EmeRobustness::INVALID); |
| 435 DCHECK(info.persistent_license_support != EME_SESSION_TYPE_INVALID); | 447 DCHECK(info.persistent_license_support != EME_SESSION_TYPE_INVALID); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 499 DCHECK(!IsConcreteSupportedKeySystem(info.parent_key_system)) | 511 DCHECK(!IsConcreteSupportedKeySystem(info.parent_key_system)) |
| 500 << "Parent '" << info.parent_key_system << "' " | 512 << "Parent '" << info.parent_key_system << "' " |
| 501 << "already registered concrete"; | 513 << "already registered concrete"; |
| 502 DCHECK(!parent_key_system_map_.count(info.parent_key_system)) | 514 DCHECK(!parent_key_system_map_.count(info.parent_key_system)) |
| 503 << "Parent '" << info.parent_key_system << "' already registered"; | 515 << "Parent '" << info.parent_key_system << "' already registered"; |
| 504 parent_key_system_map_[info.parent_key_system] = info.key_system; | 516 parent_key_system_map_[info.parent_key_system] = info.key_system; |
| 505 } | 517 } |
| 506 } | 518 } |
| 507 } | 519 } |
| 508 | 520 |
| 509 bool KeySystems::IsConcreteSupportedKeySystem(const std::string& key_system) { | 521 bool KeySystemsImpl::IsConcreteSupportedKeySystem( |
| 522 const std::string& key_system) const { |
| 510 DCHECK(thread_checker_.CalledOnValidThread()); | 523 DCHECK(thread_checker_.CalledOnValidThread()); |
| 511 return concrete_key_system_map_.count(key_system) != 0; | 524 return concrete_key_system_map_.count(key_system) != 0; |
| 512 } | 525 } |
| 513 | 526 |
| 514 bool KeySystems::IsSupportedContainer( | 527 bool KeySystemsImpl::IsSupportedContainer( |
| 515 const std::string& container, | 528 const std::string& container, |
| 516 SupportedCodecs key_system_supported_codecs) const { | 529 SupportedCodecs key_system_supported_codecs) const { |
| 517 DCHECK(thread_checker_.CalledOnValidThread()); | 530 DCHECK(thread_checker_.CalledOnValidThread()); |
| 518 DCHECK(!container.empty()); | 531 DCHECK(!container.empty()); |
| 519 | 532 |
| 520 // When checking container support for EME, "audio/foo" should be treated the | 533 // When checking container support for EME, "audio/foo" should be treated the |
| 521 // same as "video/foo". Convert the |container| to achieve this. | 534 // same as "video/foo". Convert the |container| to achieve this. |
| 522 // TODO(xhwang): Replace this with real checks against supported initDataTypes | 535 // TODO(xhwang): Replace this with real checks against supported initDataTypes |
| 523 // combined with supported demuxers. | 536 // combined with supported demuxers. |
| 524 std::string canonical_container = container; | 537 std::string canonical_container = container; |
| 525 if (container.find("audio/") == 0) | 538 if (container.find("audio/") == 0) |
| 526 canonical_container.replace(0, 6, "video/"); | 539 canonical_container.replace(0, 6, "video/"); |
| 527 | 540 |
| 528 // A container is supported iif at least one codec in that container is | 541 // A container is supported iif at least one codec in that container is |
| 529 // supported. | 542 // supported. |
| 530 SupportedCodecs supported_codecs = | 543 SupportedCodecs supported_codecs = |
| 531 GetCodecMaskForContainer(canonical_container); | 544 GetCodecMaskForContainer(canonical_container); |
| 532 return (supported_codecs & key_system_supported_codecs) != 0; | 545 return (supported_codecs & key_system_supported_codecs) != 0; |
| 533 } | 546 } |
| 534 | 547 |
| 535 bool KeySystems::IsSupportedContainerAndCodecs( | 548 bool KeySystemsImpl::IsSupportedContainerAndCodecs( |
| 536 const std::string& container, | 549 const std::string& container, |
| 537 const std::vector<std::string>& codecs, | 550 const std::vector<std::string>& codecs, |
| 538 SupportedCodecs key_system_supported_codecs) const { | 551 SupportedCodecs key_system_supported_codecs) const { |
| 539 DCHECK(thread_checker_.CalledOnValidThread()); | 552 DCHECK(thread_checker_.CalledOnValidThread()); |
| 540 DCHECK(!container.empty()); | 553 DCHECK(!container.empty()); |
| 541 DCHECK(!codecs.empty()); | 554 DCHECK(!codecs.empty()); |
| 542 DCHECK(IsSupportedContainer(container, key_system_supported_codecs)); | 555 DCHECK(IsSupportedContainer(container, key_system_supported_codecs)); |
| 543 | 556 |
| 544 SupportedCodecs container_supported_codecs = | 557 SupportedCodecs container_supported_codecs = |
| 545 GetCodecMaskForContainer(container); | 558 GetCodecMaskForContainer(container); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 557 return false; | 570 return false; |
| 558 | 571 |
| 559 // Unsupported codec/container combination, e.g. "video/webm" and "avc1". | 572 // Unsupported codec/container combination, e.g. "video/webm" and "avc1". |
| 560 if (!(codec & container_supported_codecs)) | 573 if (!(codec & container_supported_codecs)) |
| 561 return false; | 574 return false; |
| 562 } | 575 } |
| 563 | 576 |
| 564 return true; | 577 return true; |
| 565 } | 578 } |
| 566 | 579 |
| 567 bool KeySystems::IsSupportedKeySystem(const std::string& key_system) { | 580 bool KeySystemsImpl::IsSupportedKeySystemWithInitDataType( |
| 568 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 569 // Unprefixed EME only supports concrete key systems. | |
| 570 return concrete_key_system_map_.count(key_system) != 0; | |
| 571 } | |
| 572 | |
| 573 bool KeySystems::IsSupportedKeySystemWithInitDataType( | |
| 574 const std::string& key_system, | 581 const std::string& key_system, |
| 575 const std::string& init_data_type) { | 582 const std::string& init_data_type) const { |
| 576 DCHECK(thread_checker_.CalledOnValidThread()); | 583 DCHECK(thread_checker_.CalledOnValidThread()); |
| 577 | 584 |
| 578 // Locate |key_system|. Only concrete key systems are supported in unprefixed. | 585 // Locate |key_system|. Only concrete key systems are supported in unprefixed. |
| 579 KeySystemInfoMap::const_iterator key_system_iter = | 586 KeySystemInfoMap::const_iterator key_system_iter = |
| 580 concrete_key_system_map_.find(key_system); | 587 concrete_key_system_map_.find(key_system); |
| 581 if (key_system_iter == concrete_key_system_map_.end()) | 588 if (key_system_iter == concrete_key_system_map_.end()) |
| 582 return false; | 589 return false; |
| 583 | 590 |
| 584 // Check |init_data_type| and |key_system| x |init_data_type|. | 591 // Check |init_data_type| and |key_system| x |init_data_type|. |
| 585 const KeySystemInfo& info = key_system_iter->second; | 592 const KeySystemInfo& info = key_system_iter->second; |
| 586 EmeInitDataType eme_init_data_type = GetInitDataTypeForName(init_data_type); | 593 EmeInitDataType eme_init_data_type = GetInitDataTypeForName(init_data_type); |
| 587 return (info.supported_init_data_types & eme_init_data_type) != 0; | 594 return (info.supported_init_data_types & eme_init_data_type) != 0; |
| 588 } | 595 } |
| 589 | 596 |
| 590 // TODO(sandersd): Reorganize to be more similar to | 597 bool KeySystemsImpl::PrefixedIsSupportedKeySystemWithMediaMimeType( |
| 591 // IsKeySystemSupportedWithInitDataType(). Note that a fork may still be | |
| 592 // required; http://crbug.com/417461. | |
| 593 bool KeySystems::IsSupportedKeySystemWithMediaMimeType( | |
| 594 const std::string& mime_type, | 598 const std::string& mime_type, |
| 595 const std::vector<std::string>& codecs, | 599 const std::vector<std::string>& codecs, |
| 596 const std::string& key_system, | 600 const std::string& key_system) { |
| 597 bool is_prefixed) { | |
| 598 DCHECK(thread_checker_.CalledOnValidThread()); | 601 DCHECK(thread_checker_.CalledOnValidThread()); |
| 599 const bool report_to_uma = is_prefixed; | |
| 600 | 602 |
| 601 // If |is_prefixed| and |key_system| is a parent key system, use its concrete | 603 const std::string& concrete_key_system = |
| 602 // child. | 604 PrefixedGetConcreteKeySystemNameFor(key_system); |
| 603 const std::string& concrete_key_system = is_prefixed ? | |
| 604 PrefixedGetConcreteKeySystemNameFor(key_system) : | |
| 605 key_system; | |
| 606 | 605 |
| 607 bool has_type = !mime_type.empty(); | 606 bool has_type = !mime_type.empty(); |
| 608 | 607 |
| 609 if (report_to_uma) | 608 key_systems_support_uma_.ReportKeySystemQuery(key_system, has_type); |
| 610 key_systems_support_uma_.ReportKeySystemQuery(key_system, has_type); | |
| 611 | 609 |
| 612 // Check key system support. | 610 // Check key system support. |
| 613 KeySystemInfoMap::const_iterator key_system_iter = | 611 KeySystemInfoMap::const_iterator key_system_iter = |
| 614 concrete_key_system_map_.find(concrete_key_system); | 612 concrete_key_system_map_.find(concrete_key_system); |
| 615 if (key_system_iter == concrete_key_system_map_.end()) | 613 if (key_system_iter == concrete_key_system_map_.end()) |
| 616 return false; | 614 return false; |
| 617 | 615 |
| 618 if (report_to_uma) | 616 key_systems_support_uma_.ReportKeySystemSupport(key_system, false); |
| 619 key_systems_support_uma_.ReportKeySystemSupport(key_system, false); | |
| 620 | 617 |
| 621 if (!has_type) { | 618 if (!has_type) { |
| 622 DCHECK(codecs.empty()); | 619 DCHECK(codecs.empty()); |
| 623 return true; | 620 return true; |
| 624 } | 621 } |
| 625 | 622 |
| 626 SupportedCodecs key_system_supported_codecs = | 623 SupportedCodecs key_system_supported_codecs = |
| 627 key_system_iter->second.supported_codecs; | 624 key_system_iter->second.supported_codecs; |
| 628 | 625 |
| 629 if (!IsSupportedContainer(mime_type, key_system_supported_codecs)) | 626 if (!IsSupportedContainer(mime_type, key_system_supported_codecs)) |
| 630 return false; | 627 return false; |
| 631 | 628 |
| 632 if (!codecs.empty() && | 629 if (!codecs.empty() && |
| 633 !IsSupportedContainerAndCodecs( | 630 !IsSupportedContainerAndCodecs( |
| 634 mime_type, codecs, key_system_supported_codecs)) { | 631 mime_type, codecs, key_system_supported_codecs)) { |
| 635 return false; | 632 return false; |
| 636 } | 633 } |
| 637 | 634 |
| 638 if (report_to_uma) | 635 key_systems_support_uma_.ReportKeySystemSupport(key_system, true); |
| 639 key_systems_support_uma_.ReportKeySystemSupport(key_system, true); | 636 |
| 640 return true; | 637 return true; |
| 641 } | 638 } |
| 642 | 639 |
| 643 std::string KeySystems::GetKeySystemNameForUMA( | 640 bool KeySystemsImpl::IsSupportedKeySystemWithMediaMimeType( |
| 641 const std::string& mime_type, |
| 642 const std::vector<std::string>& codecs, |
| 644 const std::string& key_system) const { | 643 const std::string& key_system) const { |
| 645 DCHECK(thread_checker_.CalledOnValidThread()); | 644 DCHECK(thread_checker_.CalledOnValidThread()); |
| 646 | 645 |
| 646 KeySystemInfoMap::const_iterator key_system_iter = |
| 647 concrete_key_system_map_.find(key_system); |
| 648 if (key_system_iter == concrete_key_system_map_.end()) |
| 649 return false; |
| 650 |
| 651 if (mime_type.empty()) { |
| 652 DCHECK(codecs.empty()); |
| 653 return true; |
| 654 } |
| 655 |
| 656 SupportedCodecs key_system_supported_codecs = |
| 657 key_system_iter->second.supported_codecs; |
| 658 |
| 659 if (!IsSupportedContainer(mime_type, key_system_supported_codecs)) |
| 660 return false; |
| 661 |
| 662 if (!codecs.empty() && |
| 663 !IsSupportedContainerAndCodecs( |
| 664 mime_type, codecs, key_system_supported_codecs)) { |
| 665 return false; |
| 666 } |
| 667 |
| 668 return true; |
| 669 } |
| 670 |
| 671 std::string KeySystemsImpl::GetKeySystemNameForUMA( |
| 672 const std::string& key_system) const { |
| 673 DCHECK(thread_checker_.CalledOnValidThread()); |
| 674 |
| 647 KeySystemNameForUMAMap::const_iterator iter = | 675 KeySystemNameForUMAMap::const_iterator iter = |
| 648 key_system_name_for_uma_map_.find(key_system); | 676 key_system_name_for_uma_map_.find(key_system); |
| 649 if (iter == key_system_name_for_uma_map_.end()) | 677 if (iter == key_system_name_for_uma_map_.end()) |
| 650 return kUnknownKeySystemNameForUMA; | 678 return kUnknownKeySystemNameForUMA; |
| 651 | 679 |
| 652 return iter->second; | 680 return iter->second; |
| 653 } | 681 } |
| 654 | 682 |
| 655 bool KeySystems::UseAesDecryptor(const std::string& concrete_key_system) { | 683 bool KeySystemsImpl::UseAesDecryptor( |
| 684 const std::string& concrete_key_system) const { |
| 656 DCHECK(thread_checker_.CalledOnValidThread()); | 685 DCHECK(thread_checker_.CalledOnValidThread()); |
| 657 | 686 |
| 658 KeySystemInfoMap::const_iterator key_system_iter = | 687 KeySystemInfoMap::const_iterator key_system_iter = |
| 659 concrete_key_system_map_.find(concrete_key_system); | 688 concrete_key_system_map_.find(concrete_key_system); |
| 660 if (key_system_iter == concrete_key_system_map_.end()) { | 689 if (key_system_iter == concrete_key_system_map_.end()) { |
| 661 DLOG(FATAL) << concrete_key_system << " is not a known concrete system"; | 690 DLOG(FATAL) << concrete_key_system << " is not a known concrete system"; |
| 662 return false; | 691 return false; |
| 663 } | 692 } |
| 664 | 693 |
| 665 return key_system_iter->second.use_aes_decryptor; | 694 return key_system_iter->second.use_aes_decryptor; |
| 666 } | 695 } |
| 667 | 696 |
| 668 #if defined(ENABLE_PEPPER_CDMS) | 697 #if defined(ENABLE_PEPPER_CDMS) |
| 669 std::string KeySystems::GetPepperType(const std::string& concrete_key_system) { | 698 std::string KeySystemsImpl::GetPepperType( |
| 699 const std::string& concrete_key_system) const { |
| 670 DCHECK(thread_checker_.CalledOnValidThread()); | 700 DCHECK(thread_checker_.CalledOnValidThread()); |
| 671 | 701 |
| 672 KeySystemInfoMap::const_iterator key_system_iter = | 702 KeySystemInfoMap::const_iterator key_system_iter = |
| 673 concrete_key_system_map_.find(concrete_key_system); | 703 concrete_key_system_map_.find(concrete_key_system); |
| 674 if (key_system_iter == concrete_key_system_map_.end()) { | 704 if (key_system_iter == concrete_key_system_map_.end()) { |
| 675 DLOG(FATAL) << concrete_key_system << " is not a known concrete system"; | 705 DLOG(FATAL) << concrete_key_system << " is not a known concrete system"; |
| 676 return std::string(); | 706 return std::string(); |
| 677 } | 707 } |
| 678 | 708 |
| 679 const std::string& type = key_system_iter->second.pepper_type; | 709 const std::string& type = key_system_iter->second.pepper_type; |
| 680 DLOG_IF(FATAL, type.empty()) << concrete_key_system << " is not Pepper-based"; | 710 DLOG_IF(FATAL, type.empty()) << concrete_key_system << " is not Pepper-based"; |
| 681 return type; | 711 return type; |
| 682 } | 712 } |
| 683 #endif | 713 #endif |
| 684 | 714 |
| 685 EmeConfigRule KeySystems::GetRobustnessConfigRule( | 715 void KeySystemsImpl::AddContainerMask(const std::string& container, |
| 716 uint32 mask) { |
| 717 DCHECK(thread_checker_.CalledOnValidThread()); |
| 718 DCHECK(!container_to_codec_mask_map_.count(container)); |
| 719 container_to_codec_mask_map_[container] = static_cast<EmeCodec>(mask); |
| 720 } |
| 721 |
| 722 void KeySystemsImpl::AddCodecMask(const std::string& codec, uint32 mask) { |
| 723 DCHECK(thread_checker_.CalledOnValidThread()); |
| 724 DCHECK(!codec_string_map_.count(codec)); |
| 725 codec_string_map_[codec] = static_cast<EmeCodec>(mask); |
| 726 } |
| 727 |
| 728 bool KeySystemsImpl::IsSupportedKeySystem(const std::string& key_system) const { |
| 729 DCHECK(thread_checker_.CalledOnValidThread()); |
| 730 return concrete_key_system_map_.count(key_system) != 0; |
| 731 } |
| 732 |
| 733 // TODO(sandersd): Make sure that the codecs also match the |media_type|. |
| 734 // http://crbug.com/457386 |
| 735 bool KeySystemsImpl::IsSupportedCodecCombination( |
| 686 const std::string& key_system, | 736 const std::string& key_system, |
| 687 EmeMediaType media_type, | 737 EmeMediaType media_type, |
| 688 const std::string& requested_robustness) { | 738 const std::string& container_mime_type, |
| 739 const std::vector<std::string>& codecs) const { |
| 740 // Make sure the container matches |media_type|. |
| 741 switch (media_type) { |
| 742 case EmeMediaType::AUDIO: |
| 743 if (!StartsWithASCII(container_mime_type, "audio/", true)) |
| 744 return false; |
| 745 break; |
| 746 case EmeMediaType::VIDEO: |
| 747 if (!StartsWithASCII(container_mime_type, "video/", true)) |
| 748 return false; |
| 749 break; |
| 750 } |
| 751 return IsSupportedKeySystemWithMediaMimeType( |
| 752 container_mime_type, codecs, key_system); |
| 753 } |
| 754 |
| 755 EmeConfigRule KeySystemsImpl::GetRobustnessConfigRule( |
| 756 const std::string& key_system, |
| 757 EmeMediaType media_type, |
| 758 const std::string& requested_robustness) const { |
| 689 DCHECK(thread_checker_.CalledOnValidThread()); | 759 DCHECK(thread_checker_.CalledOnValidThread()); |
| 690 | 760 |
| 691 EmeRobustness robustness = ConvertRobustness(requested_robustness); | 761 EmeRobustness robustness = ConvertRobustness(requested_robustness); |
| 692 if (robustness == EmeRobustness::INVALID) | 762 if (robustness == EmeRobustness::INVALID) |
| 693 return EmeConfigRule::NOT_SUPPORTED; | 763 return EmeConfigRule::NOT_SUPPORTED; |
| 694 if (robustness == EmeRobustness::EMPTY) | 764 if (robustness == EmeRobustness::EMPTY) |
| 695 return EmeConfigRule::SUPPORTED; | 765 return EmeConfigRule::SUPPORTED; |
| 696 | 766 |
| 697 KeySystemInfoMap::const_iterator key_system_iter = | 767 KeySystemInfoMap::const_iterator key_system_iter = |
| 698 concrete_key_system_map_.find(key_system); | 768 concrete_key_system_map_.find(key_system); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 735 if (media_type == EmeMediaType::VIDEO && | 805 if (media_type == EmeMediaType::VIDEO && |
| 736 max_robustness == EmeRobustness::HW_SECURE_ALL) { | 806 max_robustness == EmeRobustness::HW_SECURE_ALL) { |
| 737 return EmeConfigRule::IDENTIFIER_RECOMMENDED; | 807 return EmeConfigRule::IDENTIFIER_RECOMMENDED; |
| 738 } | 808 } |
| 739 } | 809 } |
| 740 #endif // defined(OS_CHROMEOS) | 810 #endif // defined(OS_CHROMEOS) |
| 741 | 811 |
| 742 return EmeConfigRule::SUPPORTED; | 812 return EmeConfigRule::SUPPORTED; |
| 743 } | 813 } |
| 744 | 814 |
| 745 EmeConfigRule KeySystems::GetPersistentLicenseSessionConfigRule( | 815 EmeConfigRule KeySystemsImpl::GetPersistentLicenseSessionConfigRule( |
| 746 const std::string& key_system) { | 816 const std::string& key_system) const { |
| 747 DCHECK(thread_checker_.CalledOnValidThread()); | 817 DCHECK(thread_checker_.CalledOnValidThread()); |
| 748 | 818 |
| 749 KeySystemInfoMap::const_iterator key_system_iter = | 819 KeySystemInfoMap::const_iterator key_system_iter = |
| 750 concrete_key_system_map_.find(key_system); | 820 concrete_key_system_map_.find(key_system); |
| 751 if (key_system_iter == concrete_key_system_map_.end()) { | 821 if (key_system_iter == concrete_key_system_map_.end()) { |
| 752 NOTREACHED(); | 822 NOTREACHED(); |
| 753 return EmeConfigRule::NOT_SUPPORTED; | 823 return EmeConfigRule::NOT_SUPPORTED; |
| 754 } | 824 } |
| 755 return ConvertSessionTypeSupport( | 825 return ConvertSessionTypeSupport( |
| 756 key_system_iter->second.persistent_license_support); | 826 key_system_iter->second.persistent_license_support); |
| 757 } | 827 } |
| 758 | 828 |
| 759 EmeConfigRule KeySystems::GetPersistentReleaseMessageSessionConfigRule( | 829 EmeConfigRule KeySystemsImpl::GetPersistentReleaseMessageSessionConfigRule( |
| 760 const std::string& key_system) { | 830 const std::string& key_system) const { |
| 761 DCHECK(thread_checker_.CalledOnValidThread()); | 831 DCHECK(thread_checker_.CalledOnValidThread()); |
| 762 | 832 |
| 763 KeySystemInfoMap::const_iterator key_system_iter = | 833 KeySystemInfoMap::const_iterator key_system_iter = |
| 764 concrete_key_system_map_.find(key_system); | 834 concrete_key_system_map_.find(key_system); |
| 765 if (key_system_iter == concrete_key_system_map_.end()) { | 835 if (key_system_iter == concrete_key_system_map_.end()) { |
| 766 NOTREACHED(); | 836 NOTREACHED(); |
| 767 return EmeConfigRule::NOT_SUPPORTED; | 837 return EmeConfigRule::NOT_SUPPORTED; |
| 768 } | 838 } |
| 769 return ConvertSessionTypeSupport( | 839 return ConvertSessionTypeSupport( |
| 770 key_system_iter->second.persistent_release_message_support); | 840 key_system_iter->second.persistent_release_message_support); |
| 771 } | 841 } |
| 772 | 842 |
| 773 EmeConfigRule KeySystems::GetPersistentStateConfigRule( | 843 EmeConfigRule KeySystemsImpl::GetPersistentStateConfigRule( |
| 774 const std::string& key_system, | 844 const std::string& key_system, |
| 775 EmeFeatureRequirement requirement) { | 845 EmeFeatureRequirement requirement) const { |
| 776 DCHECK(thread_checker_.CalledOnValidThread()); | 846 DCHECK(thread_checker_.CalledOnValidThread()); |
| 777 | 847 |
| 778 KeySystemInfoMap::const_iterator key_system_iter = | 848 KeySystemInfoMap::const_iterator key_system_iter = |
| 779 concrete_key_system_map_.find(key_system); | 849 concrete_key_system_map_.find(key_system); |
| 780 if (key_system_iter == concrete_key_system_map_.end()) { | 850 if (key_system_iter == concrete_key_system_map_.end()) { |
| 781 NOTREACHED(); | 851 NOTREACHED(); |
| 782 return EmeConfigRule::NOT_SUPPORTED; | 852 return EmeConfigRule::NOT_SUPPORTED; |
| 783 } | 853 } |
| 784 | 854 |
| 785 // For NOT_ALLOWED and REQUIRED, the result is as expected. For OPTIONAL, we | 855 // For NOT_ALLOWED and REQUIRED, the result is as expected. For OPTIONAL, we |
| (...skipping 19 matching lines...) Expand all Loading... |
| 805 requirement == EME_FEATURE_NOT_ALLOWED) { | 875 requirement == EME_FEATURE_NOT_ALLOWED) { |
| 806 return EmeConfigRule::NOT_SUPPORTED; | 876 return EmeConfigRule::NOT_SUPPORTED; |
| 807 } | 877 } |
| 808 if (support == EME_FEATURE_REQUESTABLE_WITH_IDENTIFIER && | 878 if (support == EME_FEATURE_REQUESTABLE_WITH_IDENTIFIER && |
| 809 requirement == EME_FEATURE_REQUIRED) { | 879 requirement == EME_FEATURE_REQUIRED) { |
| 810 return EmeConfigRule::IDENTIFIER_REQUIRED; | 880 return EmeConfigRule::IDENTIFIER_REQUIRED; |
| 811 } | 881 } |
| 812 return EmeConfigRule::SUPPORTED; | 882 return EmeConfigRule::SUPPORTED; |
| 813 } | 883 } |
| 814 | 884 |
| 815 EmeConfigRule KeySystems::GetDistinctiveIdentifierConfigRule( | 885 EmeConfigRule KeySystemsImpl::GetDistinctiveIdentifierConfigRule( |
| 816 const std::string& key_system, | 886 const std::string& key_system, |
| 817 EmeFeatureRequirement requirement) { | 887 EmeFeatureRequirement requirement) const { |
| 818 DCHECK(thread_checker_.CalledOnValidThread()); | 888 DCHECK(thread_checker_.CalledOnValidThread()); |
| 819 | 889 |
| 820 KeySystemInfoMap::const_iterator key_system_iter = | 890 KeySystemInfoMap::const_iterator key_system_iter = |
| 821 concrete_key_system_map_.find(key_system); | 891 concrete_key_system_map_.find(key_system); |
| 822 if (key_system_iter == concrete_key_system_map_.end()) { | 892 if (key_system_iter == concrete_key_system_map_.end()) { |
| 823 NOTREACHED(); | 893 NOTREACHED(); |
| 824 return EmeConfigRule::NOT_SUPPORTED; | 894 return EmeConfigRule::NOT_SUPPORTED; |
| 825 } | 895 } |
| 826 | 896 |
| 827 // Permission is required for REQUIRED, but not for NOT_ALLOWED. For OPTIONAL, | 897 // Permission is required for REQUIRED, but not for NOT_ALLOWED. For OPTIONAL, |
| (...skipping 15 matching lines...) Expand all Loading... |
| 843 requirement == EME_FEATURE_NOT_ALLOWED) { | 913 requirement == EME_FEATURE_NOT_ALLOWED) { |
| 844 return EmeConfigRule::NOT_SUPPORTED; | 914 return EmeConfigRule::NOT_SUPPORTED; |
| 845 } | 915 } |
| 846 if (support == EME_FEATURE_ALWAYS_ENABLED || | 916 if (support == EME_FEATURE_ALWAYS_ENABLED || |
| 847 requirement == EME_FEATURE_REQUIRED) { | 917 requirement == EME_FEATURE_REQUIRED) { |
| 848 return EmeConfigRule::IDENTIFIER_REQUIRED; | 918 return EmeConfigRule::IDENTIFIER_REQUIRED; |
| 849 } | 919 } |
| 850 return EmeConfigRule::SUPPORTED; | 920 return EmeConfigRule::SUPPORTED; |
| 851 } | 921 } |
| 852 | 922 |
| 853 void KeySystems::AddContainerMask(const std::string& container, uint32 mask) { | 923 KeySystems& KeySystems::GetInstance() { |
| 854 DCHECK(thread_checker_.CalledOnValidThread()); | 924 return KeySystemsImpl::GetInstance(); |
| 855 DCHECK(!container_to_codec_mask_map_.count(container)); | |
| 856 container_to_codec_mask_map_[container] = static_cast<EmeCodec>(mask); | |
| 857 } | |
| 858 | |
| 859 void KeySystems::AddCodecMask(const std::string& codec, uint32 mask) { | |
| 860 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 861 DCHECK(!codec_string_map_.count(codec)); | |
| 862 codec_string_map_[codec] = static_cast<EmeCodec>(mask); | |
| 863 } | 925 } |
| 864 | 926 |
| 865 //------------------------------------------------------------------------------ | 927 //------------------------------------------------------------------------------ |
| 866 | 928 |
| 867 std::string GetUnprefixedKeySystemName(const std::string& key_system) { | 929 std::string GetUnprefixedKeySystemName(const std::string& key_system) { |
| 868 if (key_system == kClearKeyKeySystem) | 930 if (key_system == kClearKeyKeySystem) |
| 869 return kUnsupportedClearKeyKeySystem; | 931 return kUnsupportedClearKeyKeySystem; |
| 870 | 932 |
| 871 if (key_system == kPrefixedClearKeyKeySystem) | 933 if (key_system == kPrefixedClearKeyKeySystem) |
| 872 return kClearKeyKeySystem; | 934 return kClearKeyKeySystem; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 889 if (init_data_type == "cenc") { | 951 if (init_data_type == "cenc") { |
| 890 return container == "audio/mp4" || container == "video/mp4"; | 952 return container == "audio/mp4" || container == "video/mp4"; |
| 891 } else if (init_data_type == "webm") { | 953 } else if (init_data_type == "webm") { |
| 892 return container == "audio/webm" || container == "video/webm"; | 954 return container == "audio/webm" || container == "video/webm"; |
| 893 } else { | 955 } else { |
| 894 return true; | 956 return true; |
| 895 } | 957 } |
| 896 } | 958 } |
| 897 | 959 |
| 898 bool PrefixedIsSupportedConcreteKeySystem(const std::string& key_system) { | 960 bool PrefixedIsSupportedConcreteKeySystem(const std::string& key_system) { |
| 899 return KeySystems::GetInstance().IsConcreteSupportedKeySystem(key_system); | 961 return KeySystemsImpl::GetInstance().IsConcreteSupportedKeySystem(key_system); |
| 900 } | 962 } |
| 901 | 963 |
| 902 bool IsSupportedKeySystem(const std::string& key_system) { | 964 bool IsSupportedKeySystem(const std::string& key_system) { |
| 903 if (!KeySystems::GetInstance().IsSupportedKeySystem(key_system)) | 965 if (!KeySystemsImpl::GetInstance().IsSupportedKeySystem(key_system)) |
| 904 return false; | 966 return false; |
| 905 | 967 |
| 906 // TODO(ddorwin): Move this to where we add key systems when prefixed EME is | 968 // TODO(ddorwin): Move this to where we add key systems when prefixed EME is |
| 907 // removed (crbug.com/249976). | 969 // removed (crbug.com/249976). |
| 908 if (!IsPotentiallySupportedKeySystem(key_system)) { | 970 if (!IsPotentiallySupportedKeySystem(key_system)) { |
| 909 // If you encounter this path, see the comments for the above function. | 971 // If you encounter this path, see the comments for the above function. |
| 910 NOTREACHED() << "Unrecognized key system " << key_system | 972 NOTREACHED() << "Unrecognized key system " << key_system |
| 911 << ". See code comments."; | 973 << ". See code comments."; |
| 912 return false; | 974 return false; |
| 913 } | 975 } |
| 914 | 976 |
| 915 return true; | 977 return true; |
| 916 } | 978 } |
| 917 | 979 |
| 918 bool IsSupportedKeySystemWithInitDataType( | 980 bool IsSupportedKeySystemWithInitDataType( |
| 919 const std::string& key_system, | 981 const std::string& key_system, |
| 920 const std::string& init_data_type) { | 982 const std::string& init_data_type) { |
| 921 return KeySystems::GetInstance().IsSupportedKeySystemWithInitDataType( | 983 return KeySystemsImpl::GetInstance().IsSupportedKeySystemWithInitDataType( |
| 922 key_system, init_data_type); | 984 key_system, init_data_type); |
| 923 } | 985 } |
| 924 | 986 |
| 925 bool IsSupportedKeySystemWithMediaMimeType( | 987 bool IsSupportedKeySystemWithMediaMimeType( |
| 926 const std::string& mime_type, | 988 const std::string& mime_type, |
| 927 const std::vector<std::string>& codecs, | 989 const std::vector<std::string>& codecs, |
| 928 const std::string& key_system) { | 990 const std::string& key_system) { |
| 929 return KeySystems::GetInstance().IsSupportedKeySystemWithMediaMimeType( | 991 return KeySystemsImpl::GetInstance().IsSupportedKeySystemWithMediaMimeType( |
| 930 mime_type, codecs, key_system, false); | 992 mime_type, codecs, key_system); |
| 931 } | 993 } |
| 932 | 994 |
| 933 bool PrefixedIsSupportedKeySystemWithMediaMimeType( | 995 bool PrefixedIsSupportedKeySystemWithMediaMimeType( |
| 934 const std::string& mime_type, | 996 const std::string& mime_type, |
| 935 const std::vector<std::string>& codecs, | 997 const std::vector<std::string>& codecs, |
| 936 const std::string& key_system) { | 998 const std::string& key_system) { |
| 937 return KeySystems::GetInstance().IsSupportedKeySystemWithMediaMimeType( | 999 return KeySystemsImpl::GetInstance() |
| 938 mime_type, codecs, key_system, true); | 1000 .PrefixedIsSupportedKeySystemWithMediaMimeType(mime_type, codecs, |
| 1001 key_system); |
| 939 } | 1002 } |
| 940 | 1003 |
| 941 std::string GetKeySystemNameForUMA(const std::string& key_system) { | 1004 std::string GetKeySystemNameForUMA(const std::string& key_system) { |
| 942 return KeySystems::GetInstance().GetKeySystemNameForUMA(key_system); | 1005 return KeySystemsImpl::GetInstance().GetKeySystemNameForUMA(key_system); |
| 943 } | 1006 } |
| 944 | 1007 |
| 945 bool CanUseAesDecryptor(const std::string& concrete_key_system) { | 1008 bool CanUseAesDecryptor(const std::string& concrete_key_system) { |
| 946 return KeySystems::GetInstance().UseAesDecryptor(concrete_key_system); | 1009 return KeySystemsImpl::GetInstance().UseAesDecryptor(concrete_key_system); |
| 947 } | 1010 } |
| 948 | 1011 |
| 949 #if defined(ENABLE_PEPPER_CDMS) | 1012 #if defined(ENABLE_PEPPER_CDMS) |
| 950 std::string GetPepperType(const std::string& concrete_key_system) { | 1013 std::string GetPepperType(const std::string& concrete_key_system) { |
| 951 return KeySystems::GetInstance().GetPepperType(concrete_key_system); | 1014 return KeySystemsImpl::GetInstance().GetPepperType(concrete_key_system); |
| 952 } | 1015 } |
| 953 #endif | 1016 #endif |
| 954 | 1017 |
| 955 EmeConfigRule GetRobustnessConfigRule( | |
| 956 const std::string& key_system, | |
| 957 EmeMediaType media_type, | |
| 958 const std::string& robustness) { | |
| 959 return KeySystems::GetInstance().GetRobustnessConfigRule( | |
| 960 key_system, media_type, robustness); | |
| 961 } | |
| 962 | |
| 963 EmeConfigRule GetPersistentLicenseSessionConfigRule( | |
| 964 const std::string& key_system) { | |
| 965 return KeySystems::GetInstance().GetPersistentLicenseSessionConfigRule( | |
| 966 key_system); | |
| 967 } | |
| 968 | |
| 969 EmeConfigRule GetPersistentReleaseMessageSessionConfigRule( | |
| 970 const std::string& key_system) { | |
| 971 return KeySystems::GetInstance().GetPersistentReleaseMessageSessionConfigRule( | |
| 972 key_system); | |
| 973 } | |
| 974 | |
| 975 EmeConfigRule GetPersistentStateConfigRule( | |
| 976 const std::string& key_system, | |
| 977 EmeFeatureRequirement requirement) { | |
| 978 return KeySystems::GetInstance().GetPersistentStateConfigRule( | |
| 979 key_system, requirement); | |
| 980 } | |
| 981 | |
| 982 EmeConfigRule GetDistinctiveIdentifierConfigRule( | |
| 983 const std::string& key_system, | |
| 984 EmeFeatureRequirement requirement) { | |
| 985 return KeySystems::GetInstance().GetDistinctiveIdentifierConfigRule( | |
| 986 key_system, requirement); | |
| 987 } | |
| 988 | |
| 989 // These two functions are for testing purpose only. The declaration in the | 1018 // These two functions are for testing purpose only. The declaration in the |
| 990 // header file is guarded by "#if defined(UNIT_TEST)" so that they can be used | 1019 // header file is guarded by "#if defined(UNIT_TEST)" so that they can be used |
| 991 // by tests but not non-test code. However, this .cc file is compiled as part of | 1020 // by tests but not non-test code. However, this .cc file is compiled as part of |
| 992 // "media" where "UNIT_TEST" is not defined. So we need to specify | 1021 // "media" where "UNIT_TEST" is not defined. So we need to specify |
| 993 // "MEDIA_EXPORT" here again so that they are visible to tests. | 1022 // "MEDIA_EXPORT" here again so that they are visible to tests. |
| 994 | 1023 |
| 995 MEDIA_EXPORT void AddContainerMask(const std::string& container, uint32 mask) { | 1024 MEDIA_EXPORT void AddContainerMask(const std::string& container, uint32 mask) { |
| 996 KeySystems::GetInstance().AddContainerMask(container, mask); | 1025 KeySystemsImpl::GetInstance().AddContainerMask(container, mask); |
| 997 } | 1026 } |
| 998 | 1027 |
| 999 MEDIA_EXPORT void AddCodecMask(const std::string& codec, uint32 mask) { | 1028 MEDIA_EXPORT void AddCodecMask(const std::string& codec, uint32 mask) { |
| 1000 KeySystems::GetInstance().AddCodecMask(codec, mask); | 1029 KeySystemsImpl::GetInstance().AddCodecMask(codec, mask); |
| 1001 } | 1030 } |
| 1002 | 1031 |
| 1003 } // namespace media | 1032 } // namespace media |
| OLD | NEW |