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

Side by Side Diff: media/base/key_systems.cc

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

Powered by Google App Engine
This is Rietveld 408576698