1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/renderer/media/crypto/key_systems.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include <string> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/containers/hash_tables.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/lazy_instance.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_util.h" 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/threading/thread_checker.h" 145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/time/time.h" 15d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/public/common/content_client.h" 165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/public/common/eme_codec.h" 17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/public/renderer/content_renderer_client.h" 18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/public/renderer/key_system_info.h" 19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/renderer/media/crypto/key_systems_support_uma.h" 200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#if defined(OS_ANDROID) 220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "media/base/android/media_codec_bridge.h" 230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace content { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kClearKeyKeySystem[] = "org.w3.clearkey"; 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kPrefixedClearKeyKeySystem[] = "webkit-org.w3.clearkey"; 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kUnsupportedClearKeyKeySystem[] = "unsupported-org.w3.clearkey"; 3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustruct CodecMask { 345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const char* type; 355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EmeCodec mask; 365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}; 3768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Mapping between container types and the masks of associated codecs. 395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Only audio codec can belong to a "audio/*" container. Both audio and video 405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// codecs can belong to a "video/*" container. 415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuCodecMask kContainerCodecMasks[] = { 425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu {"audio/webm", EME_CODEC_WEBM_AUDIO_ALL}, 435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu {"video/webm", EME_CODEC_WEBM_ALL}, 4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(USE_PROPRIETARY_CODECS) 455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu {"audio/mp4", EME_CODEC_MP4_AUDIO_ALL}, 465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu {"video/mp4", EME_CODEC_MP4_ALL} 4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif // defined(USE_PROPRIETARY_CODECS) 485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}; 495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Mapping between codec types and their masks. 515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuCodecMask kCodecMasks[] = { 525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu {"vorbis", EME_CODEC_WEBM_VORBIS}, 535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu {"vp8", EME_CODEC_WEBM_VP8}, 545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu {"vp8.0", EME_CODEC_WEBM_VP8}, 555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu {"vp9", EME_CODEC_WEBM_VP9}, 565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu {"vp9.0", EME_CODEC_WEBM_VP9}, 575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#if defined(USE_PROPRIETARY_CODECS) 585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu {"mp4a", EME_CODEC_MP4_AAC}, 595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu {"avc1", EME_CODEC_MP4_AVC1}, 605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu {"avc3", EME_CODEC_MP4_AVC1} 615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#endif // defined(USE_PROPRIETARY_CODECS) 625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}; 63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)static void AddClearKey(std::vector<KeySystemInfo>* concrete_key_systems) { 65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) KeySystemInfo info(kClearKeyKeySystem); 66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // On Android, Vorbis, VP8, AAC and AVC1 are supported in MediaCodec: 680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // http://developer.android.com/guide/appendix/media-formats.html 695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // VP9 support is device dependent. 705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu info.supported_codecs = EME_CODEC_WEBM_ALL; 725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#if defined(OS_ANDROID) 745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Temporarily disable VP9 support for Android. 755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // TODO(xhwang): Use mime_util.h to query VP9 support on Android. 765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu info.supported_codecs &= ~EME_CODEC_WEBM_VP9; 775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#endif // defined(OS_ANDROID) 780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(USE_PROPRIETARY_CODECS) 805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu info.supported_codecs |= EME_CODEC_MP4_ALL; 81d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif // defined(USE_PROPRIETARY_CODECS) 82d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 83d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) info.use_aes_decryptor = true; 8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 85d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) concrete_key_systems->push_back(info); 86d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 87d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 88d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class KeySystems { 89d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) public: 90d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) static KeySystems& GetInstance(); 9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void UpdateIfNeeded(); 935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool IsConcreteSupportedKeySystem(const std::string& key_system); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsSupportedKeySystemWithMediaMimeType( 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& mime_type, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<std::string>& codecs, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& key_system); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool UseAesDecryptor(const std::string& concrete_key_system); 10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(ENABLE_PEPPER_CDMS) 10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string GetPepperType(const std::string& concrete_key_system); 10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void AddContainerMask(const std::string& container, uint32 mask); 1085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void AddCodecMask(const std::string& codec, uint32 mask); 1090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private: 1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void UpdateSupportedKeySystems(); 1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 113d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) void AddConcreteSupportedKeySystems( 114d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const std::vector<KeySystemInfo>& concrete_key_systems); 115d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 116d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) void AddConcreteSupportedKeySystem( 117d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const std::string& key_system, 118d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) bool use_aes_decryptor, 119d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(ENABLE_PEPPER_CDMS) 120d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const std::string& pepper_type, 121d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif 1225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SupportedCodecs supported_codecs, 123d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const std::string& parent_key_system); 124d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend struct base::DefaultLazyInstanceTraits<KeySystems>; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) struct KeySystemProperties { 1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) KeySystemProperties() 1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : use_aes_decryptor(false), supported_codecs(EME_CODEC_NONE) {} 13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool use_aes_decryptor; 13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(ENABLE_PEPPER_CDMS) 13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string pepper_type; 13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 1355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SupportedCodecs supported_codecs; 13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) }; 13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu typedef base::hash_map<std::string, KeySystemProperties> 1395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu KeySystemPropertiesMap; 1405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu typedef base::hash_map<std::string, std::string> ParentKeySystemMap; 1415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu typedef base::hash_map<std::string, EmeCodec> CodecMaskMap; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 143d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) KeySystems(); 144d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ~KeySystems() {} 145d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Returns whether a |container| type is supported by checking 1475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // |key_system_supported_codecs|. 1485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // TODO(xhwang): Update this to actually check initDataType support. 1495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu bool IsSupportedContainer(const std::string& container, 1505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SupportedCodecs key_system_supported_codecs) const; 1515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Returns true if all |codecs| are supported in |container| by checking 1535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // |key_system_supported_codecs|. 1545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu bool IsSupportedContainerAndCodecs( 1555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const std::string& container, 1565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const std::vector<std::string>& codecs, 1575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SupportedCodecs key_system_supported_codecs) const; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Map from key system string to capabilities. 16058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) KeySystemPropertiesMap concrete_key_system_map_; 16158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Map from parent key system to the concrete key system that should be used 16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // to represent its capabilities. 16458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ParentKeySystemMap parent_key_system_map_; 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) KeySystemsSupportUMA key_systems_support_uma_; 167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu CodecMaskMap container_codec_masks_; 1695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu CodecMaskMap codec_masks_; 1705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool needs_update_; 1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Time last_update_time_; 1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Makes sure all methods are called from the same thread. 1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::ThreadChecker thread_checker_; 1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(KeySystems); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static base::LazyInstance<KeySystems> g_key_systems = LAZY_INSTANCE_INITIALIZER; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 182d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)KeySystems& KeySystems::GetInstance() { 1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) KeySystems& key_systems = g_key_systems.Get(); 1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) key_systems.UpdateIfNeeded(); 1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return key_systems; 186d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 187d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 188d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Because we use a LazyInstance, the key systems info must be populated when 189d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// the instance is lazily initiated. 1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)KeySystems::KeySystems() : needs_update_(true) { 1915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Build container and codec masks for quick look up. 1925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu for (size_t i = 0; i < arraysize(kContainerCodecMasks); ++i) { 1935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const CodecMask& container_codec_mask = kContainerCodecMasks[i]; 1945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK(container_codec_masks_.find(container_codec_mask.type) == 1955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu container_codec_masks_.end()); 1965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu container_codec_masks_[container_codec_mask.type] = 1975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu container_codec_mask.mask; 1985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu for (size_t i = 0; i < arraysize(kCodecMasks); ++i) { 2005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const CodecMask& codec_mask = kCodecMasks[i]; 2015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK(codec_masks_.find(codec_mask.type) == codec_masks_.end()); 2025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu codec_masks_[codec_mask.type] = codec_mask.mask; 2035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 2045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) UpdateSupportedKeySystems(); 2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(WIDEVINE_CDM_AVAILABLE) 2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) key_systems_support_uma_.AddKeySystemToReport(kWidevineKeySystem); 2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif // defined(WIDEVINE_CDM_AVAILABLE) 2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void KeySystems::UpdateIfNeeded() { 2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(WIDEVINE_CDM_AVAILABLE) 2145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!needs_update_) 2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return; 2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // The update could involve a sync IPC to the browser process. Use a minimum 2195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // update interval to avoid unnecessary frequent IPC to the browser. 2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) static const int kMinUpdateIntervalInSeconds = 1; 2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Time now = base::Time::Now(); 2225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (now - last_update_time_ < 2235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::TimeDelta::FromSeconds(kMinUpdateIntervalInSeconds)) { 2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return; 2255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) UpdateSupportedKeySystems(); 2285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif 2295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 2305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void KeySystems::UpdateSupportedKeySystems() { 2325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 2335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(needs_update_); 2345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) concrete_key_system_map_.clear(); 2355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) parent_key_system_map_.clear(); 2365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Build KeySystemInfo. 238d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::vector<KeySystemInfo> key_systems_info; 239d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GetContentClient()->renderer()->AddKeySystems(&key_systems_info); 240d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Clear Key is always supported. 241d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) AddClearKey(&key_systems_info); 2425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 243d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) AddConcreteSupportedKeySystems(key_systems_info); 2445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(WIDEVINE_CDM_AVAILABLE) && defined(WIDEVINE_CDM_IS_COMPONENT) 2465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (IsConcreteSupportedKeySystem(kWidevineKeySystem)) 2475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) needs_update_ = false; 2485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif 2495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) last_update_time_ = base::Time::Now(); 251d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 252d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 253d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void KeySystems::AddConcreteSupportedKeySystems( 254d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const std::vector<KeySystemInfo>& concrete_key_systems) { 2555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 2565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(concrete_key_system_map_.empty()); 2575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(parent_key_system_map_.empty()); 2585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 259d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) for (size_t i = 0; i < concrete_key_systems.size(); ++i) { 260d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const KeySystemInfo& key_system_info = concrete_key_systems[i]; 261d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) AddConcreteSupportedKeySystem(key_system_info.key_system, 262d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) key_system_info.use_aes_decryptor, 263d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(ENABLE_PEPPER_CDMS) 264d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) key_system_info.pepper_type, 265d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif 2665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu key_system_info.supported_codecs, 267d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) key_system_info.parent_key_system); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void KeySystems::AddConcreteSupportedKeySystem( 27258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& concrete_key_system, 27358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool use_aes_decryptor, 27458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(ENABLE_PEPPER_CDMS) 27558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& pepper_type, 27658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 2775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SupportedCodecs supported_codecs, 27858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& parent_key_system) { 2795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 28058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(!IsConcreteSupportedKeySystem(concrete_key_system)) 28158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) << "Key system '" << concrete_key_system << "' already registered"; 282d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK(parent_key_system_map_.find(concrete_key_system) == 283d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) parent_key_system_map_.end()) 284d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) << "'" << concrete_key_system << " is already registered as a parent"; 28558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 28658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) KeySystemProperties properties; 28758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) properties.use_aes_decryptor = use_aes_decryptor; 28858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(ENABLE_PEPPER_CDMS) 28958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK_EQ(use_aes_decryptor, pepper_type.empty()); 29058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) properties.pepper_type = pepper_type; 29158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 292d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 2935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu properties.supported_codecs = supported_codecs; 294d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 29558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) concrete_key_system_map_[concrete_key_system] = properties; 29658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 29758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!parent_key_system.empty()) { 298d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK(!IsConcreteSupportedKeySystem(parent_key_system)) 299d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) << "Parent '" << parent_key_system << "' already registered concrete"; 30058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(parent_key_system_map_.find(parent_key_system) == 30158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) parent_key_system_map_.end()) 302d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) << "Parent '" << parent_key_system << "' already registered"; 30358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) parent_key_system_map_[parent_key_system] = concrete_key_system; 30458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 30558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 30658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 30758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool KeySystems::IsConcreteSupportedKeySystem(const std::string& key_system) { 3085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 30958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return concrete_key_system_map_.find(key_system) != 31058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) concrete_key_system_map_.end(); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool KeySystems::IsSupportedContainer( 3145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const std::string& container, 3155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SupportedCodecs key_system_supported_codecs) const { 3165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 3175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK(!container.empty()); 3185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // When checking container support for EME, "audio/foo" should be treated the 3205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // same as "video/foo". Convert the |container| to achieve this. 3215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // TODO(xhwang): Replace this with real checks against supported initDataTypes 3225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // combined with supported demuxers. 3235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu std::string canonical_container = container; 3245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (container.find("audio/") == 0) 3255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu canonical_container.replace(0, 6, "video/"); 3265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu CodecMaskMap::const_iterator container_iter = 3285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu container_codec_masks_.find(canonical_container); 3295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Unrecognized container. 3305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (container_iter == container_codec_masks_.end()) 3315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return false; 332a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 3335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EmeCodec container_codec_mask = container_iter->second; 3345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // A container is supported iif at least one codec in that container is 3355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // supported. 3365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return (container_codec_mask & key_system_supported_codecs) != 0; 3375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 338a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 3395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool KeySystems::IsSupportedContainerAndCodecs( 3405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const std::string& container, 3415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const std::vector<std::string>& codecs, 3425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SupportedCodecs key_system_supported_codecs) const { 3435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 3445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK(!container.empty()); 3455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK(!codecs.empty()); 3465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK(IsSupportedContainer(container, key_system_supported_codecs)); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu CodecMaskMap::const_iterator container_iter = 3495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu container_codec_masks_.find(container); 3505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EmeCodec container_codec_mask = container_iter->second; 351a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 3525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu for (size_t i = 0; i < codecs.size(); ++i) { 3535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const std::string& codec = codecs[i]; 3545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (codec.empty()) 3555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu continue; 3565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu CodecMaskMap::const_iterator codec_iter = codec_masks_.find(codec); 3575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (codec_iter == codec_masks_.end()) // Unrecognized codec. 3585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return false; 359a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 3605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EmeCodec codec_mask = codec_iter->second; 3615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!(codec_mask & key_system_supported_codecs)) // Unsupported codec. 3625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return false; 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Unsupported codec/container combination, e.g. "video/webm" and "avc1". 3655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!(codec_mask & container_codec_mask)) 3665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return false; 367a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 368a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 369a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool KeySystems::IsSupportedKeySystemWithMediaMimeType( 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& mime_type, 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<std::string>& codecs, 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& key_system) { 3765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 3775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 37858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // If |key_system| is a parent key_system, use its concrete child. 37958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Otherwise, use |key_system|. 38058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string concrete_key_system; 38158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ParentKeySystemMap::iterator parent_key_system_iter = 38258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) parent_key_system_map_.find(key_system); 38358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (parent_key_system_iter != parent_key_system_map_.end()) 38458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) concrete_key_system = parent_key_system_iter->second; 38558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) else 38658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) concrete_key_system = key_system; 38758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu bool has_type = !mime_type.empty(); 3895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu key_systems_support_uma_.ReportKeySystemQuery(key_system, has_type); 3915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Check key system support. 3935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu KeySystemPropertiesMap::const_iterator key_system_iter = 3945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu concrete_key_system_map_.find(concrete_key_system); 3955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (key_system_iter == concrete_key_system_map_.end()) 3965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return false; 3975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu key_systems_support_uma_.ReportKeySystemSupport(key_system, false); 3995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 4005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!has_type) { 4015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK(codecs.empty()); 4025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return true; 40358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SupportedCodecs key_system_supported_codecs = 4065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu key_system_iter->second.supported_codecs; 4075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 4085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!IsSupportedContainer(mime_type, key_system_supported_codecs)) 4095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return false; 4105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 4115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!codecs.empty() && 4125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu !IsSupportedContainerAndCodecs( 4135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu mime_type, codecs, key_system_supported_codecs)) { 4145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return false; 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu key_systems_support_uma_.ReportKeySystemSupport(key_system, true); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool KeySystems::UseAesDecryptor(const std::string& concrete_key_system) { 4225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 4235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 42458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) KeySystemPropertiesMap::iterator key_system_iter = 42558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) concrete_key_system_map_.find(concrete_key_system); 42658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (key_system_iter == concrete_key_system_map_.end()) { 42758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DLOG(FATAL) << concrete_key_system << " is not a known concrete system"; 42858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return false; 42958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 43058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 43158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return key_system_iter->second.use_aes_decryptor; 43258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 43358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 43458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(ENABLE_PEPPER_CDMS) 43558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)std::string KeySystems::GetPepperType(const std::string& concrete_key_system) { 4365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 4375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 43858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) KeySystemPropertiesMap::iterator key_system_iter = 43958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) concrete_key_system_map_.find(concrete_key_system); 44058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (key_system_iter == concrete_key_system_map_.end()) { 44158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DLOG(FATAL) << concrete_key_system << " is not a known concrete system"; 44258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return std::string(); 44358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 44458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 44558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& type = key_system_iter->second.pepper_type; 44658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DLOG_IF(FATAL, type.empty()) << concrete_key_system << " is not Pepper-based"; 44758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return type; 44858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 44958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 45058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid KeySystems::AddContainerMask(const std::string& container, uint32 mask) { 4525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 4535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK(container_codec_masks_.find(container) == 4545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu container_codec_masks_.end()); 4555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu container_codec_masks_[container] = static_cast<EmeCodec>(mask); 4575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 4585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 4595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid KeySystems::AddCodecMask(const std::string& codec, uint32 mask) { 4605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 4615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK(codec_masks_.find(codec) == codec_masks_.end()); 4625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu codec_masks_[codec] = static_cast<EmeCodec>(mask); 4645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 4655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 46658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)//------------------------------------------------------------------------------ 46758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 468a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)std::string GetUnprefixedKeySystemName(const std::string& key_system) { 469a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (key_system == kClearKeyKeySystem) 470a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return kUnsupportedClearKeyKeySystem; 471a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 472a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (key_system == kPrefixedClearKeyKeySystem) 473a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return kClearKeyKeySystem; 474a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 475a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return key_system; 476a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 477a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 478a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)std::string GetPrefixedKeySystemName(const std::string& key_system) { 479a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK_NE(key_system, kPrefixedClearKeyKeySystem); 480a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 481a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (key_system == kClearKeyKeySystem) 482a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return kPrefixedClearKeyKeySystem; 483a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 484a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return key_system; 485a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 486a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 487a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool IsConcreteSupportedKeySystem(const std::string& key_system) { 488a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return KeySystems::GetInstance().IsConcreteSupportedKeySystem(key_system); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsSupportedKeySystemWithMediaMimeType( 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& mime_type, 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<std::string>& codecs, 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& key_system) { 495d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return KeySystems::GetInstance().IsSupportedKeySystemWithMediaMimeType( 49658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) mime_type, codecs, key_system); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 499a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)std::string KeySystemNameForUMA(const std::string& key_system) { 500a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (key_system == kClearKeyKeySystem) 501a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return "ClearKey"; 502a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(WIDEVINE_CDM_AVAILABLE) 503a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (key_system == kWidevineKeySystem) 504a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return "Widevine"; 505a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif // WIDEVINE_CDM_AVAILABLE 506a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return "Unknown"; 507a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 508a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 50958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool CanUseAesDecryptor(const std::string& concrete_key_system) { 510d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return KeySystems::GetInstance().UseAesDecryptor(concrete_key_system); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(ENABLE_PEPPER_CDMS) 514424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)std::string GetPepperType(const std::string& concrete_key_system) { 515d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return KeySystems::GetInstance().GetPepperType(concrete_key_system); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 51758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 518eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// These two functions are for testing purpose only. The declaration in the 5205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// header file is guarded by "#if defined(UNIT_TEST)" so that they can be used 5215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// by tests but not non-test code. However, this .cc file is compiled as part of 5225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// "content" where "UNIT_TEST" is not defined. So we need to specify 5235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// "CONTENT_EXPORT" here again so that they are visible to tests. 5245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 5255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuCONTENT_EXPORT void AddContainerMask(const std::string& container, 5265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu uint32 mask) { 5275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu KeySystems::GetInstance().AddContainerMask(container, mask); 5285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 5295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 5305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuCONTENT_EXPORT void AddCodecMask(const std::string& codec, uint32 mask) { 5315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu KeySystems::GetInstance().AddCodecMask(codec, mask); 5325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 5335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 5347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} // namespace content 535