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 <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 | 10 |
11 #include "base/containers/hash_tables.h" | 11 #include "base/containers/hash_tables.h" |
12 #include "base/lazy_instance.h" | 12 #include "base/lazy_instance.h" |
13 #include "base/logging.h" | 13 #include "base/logging.h" |
14 #include "base/macros.h" | 14 #include "base/macros.h" |
15 #include "base/strings/string_util.h" | 15 #include "base/strings/string_util.h" |
16 #include "base/threading/thread_checker.h" | 16 #include "base/threading/thread_checker.h" |
17 #include "base/time/time.h" | 17 #include "base/time/time.h" |
18 #include "build/build_config.h" | 18 #include "build/build_config.h" |
19 #include "media/base/key_system_info.h" | |
20 #include "media/base/key_system_names.h" | 19 #include "media/base/key_system_names.h" |
21 #include "media/base/key_system_properties.h" | 20 #include "media/base/key_system_properties.h" |
22 #include "media/base/media.h" | 21 #include "media/base/media.h" |
23 #include "media/base/media_client.h" | 22 #include "media/base/media_client.h" |
24 #include "media/media_features.h" | 23 #include "media/media_features.h" |
25 #include "third_party/widevine/cdm/widevine_cdm_common.h" | 24 #include "third_party/widevine/cdm/widevine_cdm_common.h" |
26 | 25 |
27 namespace media { | 26 namespace media { |
28 | 27 |
29 const char kClearKeyKeySystem[] = "org.w3.clearkey"; | 28 const char kClearKeyKeySystem[] = "org.w3.clearkey"; |
(...skipping 30 matching lines...) Expand all Loading... |
60 #if defined(USE_PROPRIETARY_CODECS) | 59 #if defined(USE_PROPRIETARY_CODECS) |
61 #if BUILDFLAG(ENABLE_MP4_VP9_DEMUXING) | 60 #if BUILDFLAG(ENABLE_MP4_VP9_DEMUXING) |
62 {"vp09", EME_CODEC_MP4_VP9}, // VP9 in MP4. | 61 {"vp09", EME_CODEC_MP4_VP9}, // VP9 in MP4. |
63 #endif | 62 #endif |
64 {"mp4a", EME_CODEC_MP4_AAC}, // AAC. | 63 {"mp4a", EME_CODEC_MP4_AAC}, // AAC. |
65 {"avc1", EME_CODEC_MP4_AVC1}, // AVC1. | 64 {"avc1", EME_CODEC_MP4_AVC1}, // AVC1. |
66 {"avc3", EME_CODEC_MP4_AVC1} // AVC3. | 65 {"avc3", EME_CODEC_MP4_AVC1} // AVC3. |
67 #endif // defined(USE_PROPRIETARY_CODECS) | 66 #endif // defined(USE_PROPRIETARY_CODECS) |
68 }; | 67 }; |
69 | 68 |
70 static EmeRobustness ConvertRobustness(const std::string& robustness) { | |
71 if (robustness.empty()) | |
72 return EmeRobustness::EMPTY; | |
73 if (robustness == "SW_SECURE_CRYPTO") | |
74 return EmeRobustness::SW_SECURE_CRYPTO; | |
75 if (robustness == "SW_SECURE_DECODE") | |
76 return EmeRobustness::SW_SECURE_DECODE; | |
77 if (robustness == "HW_SECURE_CRYPTO") | |
78 return EmeRobustness::HW_SECURE_CRYPTO; | |
79 if (robustness == "HW_SECURE_DECODE") | |
80 return EmeRobustness::HW_SECURE_DECODE; | |
81 if (robustness == "HW_SECURE_ALL") | |
82 return EmeRobustness::HW_SECURE_ALL; | |
83 return EmeRobustness::INVALID; | |
84 } | |
85 | |
86 class ClearKeyProperties : public KeySystemProperties { | 69 class ClearKeyProperties : public KeySystemProperties { |
87 public: | 70 public: |
88 std::string GetKeySystemName() const override { return kClearKeyKeySystem; } | 71 std::string GetKeySystemName() const override { return kClearKeyKeySystem; } |
89 | 72 |
90 bool IsSupportedInitDataType(EmeInitDataType init_data_type) const override { | 73 bool IsSupportedInitDataType(EmeInitDataType init_data_type) const override { |
91 #if defined(USE_PROPRIETARY_CODECS) | 74 #if defined(USE_PROPRIETARY_CODECS) |
92 if (init_data_type == EmeInitDataType::CENC) | 75 if (init_data_type == EmeInitDataType::CENC) |
93 return true; | 76 return true; |
94 #endif | 77 #endif |
95 return init_data_type == EmeInitDataType::WEBM || | 78 return init_data_type == EmeInitDataType::WEBM || |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 // Implementations that do not have a specification or appropriate glue code | 167 // Implementations that do not have a specification or appropriate glue code |
185 // can use the "x-" prefix to avoid conflicting with and advertising support | 168 // can use the "x-" prefix to avoid conflicting with and advertising support |
186 // for real key system names. Use is discouraged. | 169 // for real key system names. Use is discouraged. |
187 const char kExcludedPrefix[] = "x-"; | 170 const char kExcludedPrefix[] = "x-"; |
188 if (key_system.find(kExcludedPrefix, 0, arraysize(kExcludedPrefix) - 1) == 0) | 171 if (key_system.find(kExcludedPrefix, 0, arraysize(kExcludedPrefix) - 1) == 0) |
189 return true; | 172 return true; |
190 | 173 |
191 return false; | 174 return false; |
192 } | 175 } |
193 | 176 |
194 InfoBasedKeySystemProperties::InfoBasedKeySystemProperties( | |
195 const KeySystemInfo& info) | |
196 : info_(info) { | |
197 DCHECK(info.max_audio_robustness != EmeRobustness::INVALID); | |
198 DCHECK(info.max_video_robustness != EmeRobustness::INVALID); | |
199 } | |
200 | |
201 std::string InfoBasedKeySystemProperties::GetKeySystemName() const { | |
202 return info_.key_system; | |
203 } | |
204 | |
205 SupportedCodecs InfoBasedKeySystemProperties::GetSupportedCodecs() const { | |
206 return info_.supported_codecs; | |
207 } | |
208 #if defined(OS_ANDROID) | |
209 SupportedCodecs InfoBasedKeySystemProperties::GetSupportedSecureCodecs() const { | |
210 return info_.supported_secure_codecs; | |
211 } | |
212 #endif | |
213 | |
214 class KeySystemsImpl : public KeySystems { | 177 class KeySystemsImpl : public KeySystems { |
215 public: | 178 public: |
216 static KeySystemsImpl* GetInstance(); | 179 static KeySystemsImpl* GetInstance(); |
217 | 180 |
218 void UpdateIfNeeded(); | 181 void UpdateIfNeeded(); |
219 | 182 |
220 std::string GetKeySystemNameForUMA(const std::string& key_system) const; | 183 std::string GetKeySystemNameForUMA(const std::string& key_system) const; |
221 | 184 |
222 bool UseAesDecryptor(const std::string& key_system) const; | 185 bool UseAesDecryptor(const std::string& key_system) const; |
223 | 186 |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
511 | 474 |
512 KeySystemPropertiesMap::const_iterator key_system_iter = | 475 KeySystemPropertiesMap::const_iterator key_system_iter = |
513 key_system_properties_map_.find(key_system); | 476 key_system_properties_map_.find(key_system); |
514 if (key_system_iter == key_system_properties_map_.end()) { | 477 if (key_system_iter == key_system_properties_map_.end()) { |
515 NOTREACHED(); | 478 NOTREACHED(); |
516 return false; | 479 return false; |
517 } | 480 } |
518 return key_system_iter->second->IsSupportedInitDataType(init_data_type); | 481 return key_system_iter->second->IsSupportedInitDataType(init_data_type); |
519 } | 482 } |
520 | 483 |
521 bool InfoBasedKeySystemProperties::IsSupportedInitDataType( | |
522 EmeInitDataType init_data_type) const { | |
523 // Check |init_data_type|. | |
524 InitDataTypeMask available_init_data_types = info_.supported_init_data_types; | |
525 | |
526 switch (init_data_type) { | |
527 case EmeInitDataType::UNKNOWN: | |
528 return false; | |
529 case EmeInitDataType::WEBM: | |
530 return (available_init_data_types & kInitDataTypeMaskWebM) != 0; | |
531 case EmeInitDataType::CENC: | |
532 return (available_init_data_types & kInitDataTypeMaskCenc) != 0; | |
533 case EmeInitDataType::KEYIDS: | |
534 return (available_init_data_types & kInitDataTypeMaskKeyIds) != 0; | |
535 } | |
536 NOTREACHED(); | |
537 return false; | |
538 } | |
539 | |
540 std::string KeySystemsImpl::GetKeySystemNameForUMA( | 484 std::string KeySystemsImpl::GetKeySystemNameForUMA( |
541 const std::string& key_system) const { | 485 const std::string& key_system) const { |
542 DCHECK(thread_checker_.CalledOnValidThread()); | 486 DCHECK(thread_checker_.CalledOnValidThread()); |
543 | 487 |
544 KeySystemNameForUMAMap::const_iterator iter = | 488 KeySystemNameForUMAMap::const_iterator iter = |
545 key_system_name_for_uma_map_.find(key_system); | 489 key_system_name_for_uma_map_.find(key_system); |
546 if (iter == key_system_name_for_uma_map_.end()) | 490 if (iter == key_system_name_for_uma_map_.end()) |
547 return kUnknownKeySystemNameForUMA; | 491 return kUnknownKeySystemNameForUMA; |
548 | 492 |
549 return iter->second; | 493 return iter->second; |
550 } | 494 } |
551 | 495 |
552 bool KeySystemsImpl::UseAesDecryptor(const std::string& key_system) const { | 496 bool KeySystemsImpl::UseAesDecryptor(const std::string& key_system) const { |
553 DCHECK(thread_checker_.CalledOnValidThread()); | 497 DCHECK(thread_checker_.CalledOnValidThread()); |
554 | 498 |
555 KeySystemPropertiesMap::const_iterator key_system_iter = | 499 KeySystemPropertiesMap::const_iterator key_system_iter = |
556 key_system_properties_map_.find(key_system); | 500 key_system_properties_map_.find(key_system); |
557 if (key_system_iter == key_system_properties_map_.end()) { | 501 if (key_system_iter == key_system_properties_map_.end()) { |
558 DLOG(ERROR) << key_system << " is not a known system"; | 502 DLOG(ERROR) << key_system << " is not a known system"; |
559 return false; | 503 return false; |
560 } | 504 } |
561 return key_system_iter->second->UseAesDecryptor(); | 505 return key_system_iter->second->UseAesDecryptor(); |
562 } | 506 } |
563 | 507 |
564 bool InfoBasedKeySystemProperties::UseAesDecryptor() const { | |
565 return info_.use_aes_decryptor; | |
566 } | |
567 | |
568 #if defined(ENABLE_PEPPER_CDMS) | 508 #if defined(ENABLE_PEPPER_CDMS) |
569 std::string KeySystemsImpl::GetPepperType(const std::string& key_system) const { | 509 std::string KeySystemsImpl::GetPepperType(const std::string& key_system) const { |
570 DCHECK(thread_checker_.CalledOnValidThread()); | 510 DCHECK(thread_checker_.CalledOnValidThread()); |
571 | 511 |
572 KeySystemPropertiesMap::const_iterator key_system_iter = | 512 KeySystemPropertiesMap::const_iterator key_system_iter = |
573 key_system_properties_map_.find(key_system); | 513 key_system_properties_map_.find(key_system); |
574 if (key_system_iter == key_system_properties_map_.end()) { | 514 if (key_system_iter == key_system_properties_map_.end()) { |
575 DLOG(FATAL) << key_system << " is not a known system"; | 515 DLOG(FATAL) << key_system << " is not a known system"; |
576 return std::string(); | 516 return std::string(); |
577 } | 517 } |
578 const std::string& type = key_system_iter->second->GetPepperType(); | 518 const std::string& type = key_system_iter->second->GetPepperType(); |
579 DLOG_IF(FATAL, type.empty()) << key_system_iter->second->GetKeySystemName() | 519 DLOG_IF(FATAL, type.empty()) << key_system_iter->second->GetKeySystemName() |
580 << " is not Pepper-based"; | 520 << " is not Pepper-based"; |
581 return type; | 521 return type; |
582 } | 522 } |
583 | 523 |
584 std::string InfoBasedKeySystemProperties::GetPepperType() const { | |
585 return info_.pepper_type; | |
586 } | |
587 #endif | 524 #endif |
588 | 525 |
589 void KeySystemsImpl::AddCodecMask(EmeMediaType media_type, | 526 void KeySystemsImpl::AddCodecMask(EmeMediaType media_type, |
590 const std::string& codec, | 527 const std::string& codec, |
591 uint32_t mask) { | 528 uint32_t mask) { |
592 DCHECK(thread_checker_.CalledOnValidThread()); | 529 DCHECK(thread_checker_.CalledOnValidThread()); |
593 DCHECK(!codec_string_map_.count(codec)); | 530 DCHECK(!codec_string_map_.count(codec)); |
594 codec_string_map_[codec] = static_cast<EmeCodec>(mask); | 531 codec_string_map_[codec] = static_cast<EmeCodec>(mask); |
595 if (media_type == EmeMediaType::AUDIO) { | 532 if (media_type == EmeMediaType::AUDIO) { |
596 audio_codec_mask_ |= mask; | 533 audio_codec_mask_ |= mask; |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
697 KeySystemPropertiesMap::const_iterator key_system_iter = | 634 KeySystemPropertiesMap::const_iterator key_system_iter = |
698 key_system_properties_map_.find(key_system); | 635 key_system_properties_map_.find(key_system); |
699 if (key_system_iter == key_system_properties_map_.end()) { | 636 if (key_system_iter == key_system_properties_map_.end()) { |
700 NOTREACHED(); | 637 NOTREACHED(); |
701 return EmeConfigRule::NOT_SUPPORTED; | 638 return EmeConfigRule::NOT_SUPPORTED; |
702 } | 639 } |
703 return key_system_iter->second->GetRobustnessConfigRule(media_type, | 640 return key_system_iter->second->GetRobustnessConfigRule(media_type, |
704 requested_robustness); | 641 requested_robustness); |
705 } | 642 } |
706 | 643 |
707 EmeConfigRule InfoBasedKeySystemProperties::GetRobustnessConfigRule( | |
708 EmeMediaType media_type, | |
709 const std::string& requested_robustness) const { | |
710 EmeRobustness robustness = ConvertRobustness(requested_robustness); | |
711 if (robustness == EmeRobustness::INVALID) | |
712 return EmeConfigRule::NOT_SUPPORTED; | |
713 | |
714 EmeRobustness max_robustness = EmeRobustness::INVALID; | |
715 switch (media_type) { | |
716 case EmeMediaType::AUDIO: | |
717 max_robustness = info_.max_audio_robustness; | |
718 break; | |
719 case EmeMediaType::VIDEO: | |
720 max_robustness = info_.max_video_robustness; | |
721 break; | |
722 } | |
723 | |
724 // We can compare robustness levels whenever they are not HW_SECURE_CRYPTO | |
725 // and SW_SECURE_DECODE in some order. If they are exactly those two then the | |
726 // robustness requirement is not supported. | |
727 if ((max_robustness == EmeRobustness::HW_SECURE_CRYPTO && | |
728 robustness == EmeRobustness::SW_SECURE_DECODE) || | |
729 (max_robustness == EmeRobustness::SW_SECURE_DECODE && | |
730 robustness == EmeRobustness::HW_SECURE_CRYPTO) || | |
731 robustness > max_robustness) { | |
732 return EmeConfigRule::NOT_SUPPORTED; | |
733 } | |
734 | |
735 #if defined(OS_CHROMEOS) | |
736 if (info_.key_system == kWidevineKeySystem) { | |
737 // TODO(ddorwin): Remove this once we have confirmed it is not necessary. | |
738 // See https://crbug.com/482277 | |
739 if (robustness == EmeRobustness::EMPTY) | |
740 return EmeConfigRule::SUPPORTED; | |
741 | |
742 // Hardware security requires remote attestation. | |
743 if (robustness >= EmeRobustness::HW_SECURE_CRYPTO) | |
744 return EmeConfigRule::IDENTIFIER_REQUIRED; | |
745 | |
746 // For video, recommend remote attestation if HW_SECURE_ALL is available, | |
747 // because it enables hardware accelerated decoding. | |
748 // TODO(sandersd): Only do this when hardware accelerated decoding is | |
749 // available for the requested codecs. | |
750 if (media_type == EmeMediaType::VIDEO && | |
751 max_robustness == EmeRobustness::HW_SECURE_ALL) { | |
752 return EmeConfigRule::IDENTIFIER_RECOMMENDED; | |
753 } | |
754 } | |
755 #elif defined(OS_ANDROID) | |
756 // Require hardware secure codecs for Widevine when SW_SECURE_DECODE or above | |
757 // is specified, or for all other key systems (excluding Clear Key). | |
758 if ((info_.key_system == kWidevineKeySystem && | |
759 robustness >= EmeRobustness::SW_SECURE_DECODE) || | |
760 !IsClearKey(info_.key_system)) { | |
761 return EmeConfigRule::HW_SECURE_CODECS_REQUIRED; | |
762 } | |
763 #endif // defined(OS_CHROMEOS) | |
764 | |
765 return EmeConfigRule::SUPPORTED; | |
766 } | |
767 | |
768 EmeSessionTypeSupport KeySystemsImpl::GetPersistentLicenseSessionSupport( | 644 EmeSessionTypeSupport KeySystemsImpl::GetPersistentLicenseSessionSupport( |
769 const std::string& key_system) const { | 645 const std::string& key_system) const { |
770 DCHECK(thread_checker_.CalledOnValidThread()); | 646 DCHECK(thread_checker_.CalledOnValidThread()); |
771 | 647 |
772 KeySystemPropertiesMap::const_iterator key_system_iter = | 648 KeySystemPropertiesMap::const_iterator key_system_iter = |
773 key_system_properties_map_.find(key_system); | 649 key_system_properties_map_.find(key_system); |
774 if (key_system_iter == key_system_properties_map_.end()) { | 650 if (key_system_iter == key_system_properties_map_.end()) { |
775 NOTREACHED(); | 651 NOTREACHED(); |
776 return EmeSessionTypeSupport::INVALID; | 652 return EmeSessionTypeSupport::INVALID; |
777 } | 653 } |
778 return key_system_iter->second->GetPersistentLicenseSessionSupport(); | 654 return key_system_iter->second->GetPersistentLicenseSessionSupport(); |
779 } | 655 } |
780 | 656 |
781 EmeSessionTypeSupport | |
782 InfoBasedKeySystemProperties::GetPersistentLicenseSessionSupport() const { | |
783 return info_.persistent_license_support; | |
784 } | |
785 | |
786 EmeSessionTypeSupport KeySystemsImpl::GetPersistentReleaseMessageSessionSupport( | 657 EmeSessionTypeSupport KeySystemsImpl::GetPersistentReleaseMessageSessionSupport( |
787 const std::string& key_system) const { | 658 const std::string& key_system) const { |
788 DCHECK(thread_checker_.CalledOnValidThread()); | 659 DCHECK(thread_checker_.CalledOnValidThread()); |
789 | 660 |
790 KeySystemPropertiesMap::const_iterator key_system_iter = | 661 KeySystemPropertiesMap::const_iterator key_system_iter = |
791 key_system_properties_map_.find(key_system); | 662 key_system_properties_map_.find(key_system); |
792 if (key_system_iter == key_system_properties_map_.end()) { | 663 if (key_system_iter == key_system_properties_map_.end()) { |
793 NOTREACHED(); | 664 NOTREACHED(); |
794 return EmeSessionTypeSupport::INVALID; | 665 return EmeSessionTypeSupport::INVALID; |
795 } | 666 } |
796 return key_system_iter->second->GetPersistentReleaseMessageSessionSupport(); | 667 return key_system_iter->second->GetPersistentReleaseMessageSessionSupport(); |
797 } | 668 } |
798 | 669 |
799 EmeSessionTypeSupport | |
800 InfoBasedKeySystemProperties::GetPersistentReleaseMessageSessionSupport() | |
801 const { | |
802 return info_.persistent_release_message_support; | |
803 } | |
804 | |
805 EmeFeatureSupport KeySystemsImpl::GetPersistentStateSupport( | 670 EmeFeatureSupport KeySystemsImpl::GetPersistentStateSupport( |
806 const std::string& key_system) const { | 671 const std::string& key_system) const { |
807 DCHECK(thread_checker_.CalledOnValidThread()); | 672 DCHECK(thread_checker_.CalledOnValidThread()); |
808 | 673 |
809 KeySystemPropertiesMap::const_iterator key_system_iter = | 674 KeySystemPropertiesMap::const_iterator key_system_iter = |
810 key_system_properties_map_.find(key_system); | 675 key_system_properties_map_.find(key_system); |
811 if (key_system_iter == key_system_properties_map_.end()) { | 676 if (key_system_iter == key_system_properties_map_.end()) { |
812 NOTREACHED(); | 677 NOTREACHED(); |
813 return EmeFeatureSupport::INVALID; | 678 return EmeFeatureSupport::INVALID; |
814 } | 679 } |
815 return key_system_iter->second->GetPersistentStateSupport(); | 680 return key_system_iter->second->GetPersistentStateSupport(); |
816 } | 681 } |
817 | 682 |
818 EmeFeatureSupport InfoBasedKeySystemProperties::GetPersistentStateSupport() | |
819 const { | |
820 return info_.persistent_state_support; | |
821 } | |
822 | |
823 EmeFeatureSupport KeySystemsImpl::GetDistinctiveIdentifierSupport( | 683 EmeFeatureSupport KeySystemsImpl::GetDistinctiveIdentifierSupport( |
824 const std::string& key_system) const { | 684 const std::string& key_system) const { |
825 DCHECK(thread_checker_.CalledOnValidThread()); | 685 DCHECK(thread_checker_.CalledOnValidThread()); |
826 | 686 |
827 KeySystemPropertiesMap::const_iterator key_system_iter = | 687 KeySystemPropertiesMap::const_iterator key_system_iter = |
828 key_system_properties_map_.find(key_system); | 688 key_system_properties_map_.find(key_system); |
829 if (key_system_iter == key_system_properties_map_.end()) { | 689 if (key_system_iter == key_system_properties_map_.end()) { |
830 NOTREACHED(); | 690 NOTREACHED(); |
831 return EmeFeatureSupport::INVALID; | 691 return EmeFeatureSupport::INVALID; |
832 } | 692 } |
833 return key_system_iter->second->GetDistinctiveIdentifierSupport(); | 693 return key_system_iter->second->GetDistinctiveIdentifierSupport(); |
834 } | 694 } |
835 | 695 |
836 EmeFeatureSupport | |
837 InfoBasedKeySystemProperties::GetDistinctiveIdentifierSupport() const { | |
838 return info_.distinctive_identifier_support; | |
839 } | |
840 | |
841 KeySystems* KeySystems::GetInstance() { | 696 KeySystems* KeySystems::GetInstance() { |
842 return KeySystemsImpl::GetInstance(); | 697 return KeySystemsImpl::GetInstance(); |
843 } | 698 } |
844 | 699 |
845 //------------------------------------------------------------------------------ | 700 //------------------------------------------------------------------------------ |
846 | 701 |
847 bool IsSupportedKeySystemWithInitDataType(const std::string& key_system, | 702 bool IsSupportedKeySystemWithInitDataType(const std::string& key_system, |
848 EmeInitDataType init_data_type) { | 703 EmeInitDataType init_data_type) { |
849 return KeySystemsImpl::GetInstance()->IsSupportedInitDataType(key_system, | 704 return KeySystemsImpl::GetInstance()->IsSupportedInitDataType(key_system, |
850 init_data_type); | 705 init_data_type); |
(...skipping 24 matching lines...) Expand all Loading... |
875 uint32_t mask) { | 730 uint32_t mask) { |
876 KeySystemsImpl::GetInstance()->AddCodecMask(media_type, codec, mask); | 731 KeySystemsImpl::GetInstance()->AddCodecMask(media_type, codec, mask); |
877 } | 732 } |
878 | 733 |
879 MEDIA_EXPORT void AddMimeTypeCodecMask(const std::string& mime_type, | 734 MEDIA_EXPORT void AddMimeTypeCodecMask(const std::string& mime_type, |
880 uint32_t mask) { | 735 uint32_t mask) { |
881 KeySystemsImpl::GetInstance()->AddMimeTypeCodecMask(mime_type, mask); | 736 KeySystemsImpl::GetInstance()->AddMimeTypeCodecMask(mime_type, mask); |
882 } | 737 } |
883 | 738 |
884 } // namespace media | 739 } // namespace media |
OLD | NEW |