Index: content/renderer/media/crypto/key_systems.cc |
diff --git a/content/renderer/media/crypto/key_systems.cc b/content/renderer/media/crypto/key_systems.cc |
index c828da0cc79b4e1bcfae965a846daca00a1858f8..4eeb111ed88b85d492c197a55a77353f9a73dc83 100644 |
--- a/content/renderer/media/crypto/key_systems.cc |
+++ b/content/renderer/media/crypto/key_systems.cc |
@@ -9,6 +9,9 @@ |
#include "base/lazy_instance.h" |
#include "base/logging.h" |
#include "base/strings/string_util.h" |
+#include "content/public/common/content_client.h" |
+#include "content/public/renderer/content_renderer_client.h" |
+#include "content/public/renderer/key_system_info.h" |
#include "content/renderer/media/crypto/key_systems_info.h" |
#include "net/base/mime_util.h" |
#include "third_party/WebKit/public/platform/WebCString.h" |
@@ -24,21 +27,7 @@ static std::string ToASCIIOrEmpty(const WebKit::WebString& string) { |
class KeySystems { |
public: |
- static KeySystems* GetInstance(); |
- |
- void AddConcreteSupportedKeySystem( |
- const std::string& key_system, |
- bool use_aes_decryptor, |
-#if defined(ENABLE_PEPPER_CDMS) |
- const std::string& pepper_type, |
-#elif defined(OS_ANDROID) |
- const uint8 uuid[16], |
-#endif |
- const std::string& parent_key_system); |
- |
- void AddSupportedType(const std::string& key_system, |
- const std::string& mime_type, |
- const std::string& codecs_list); |
+ static KeySystems& GetInstance(); |
bool IsConcreteSupportedKeySystem(const std::string& key_system); |
@@ -56,6 +45,21 @@ class KeySystems { |
#endif |
private: |
+ void AddConcreteSupportedKeySystems( |
+ const std::vector<KeySystemInfo>& concrete_key_systems); |
+ |
+ void AddConcreteSupportedKeySystem( |
+ const std::string& key_system, |
+ bool use_aes_decryptor, |
+#if defined(ENABLE_PEPPER_CDMS) |
+ const std::string& pepper_type, |
+#elif defined(OS_ANDROID) |
+ const std::vector<uint8>& uuid, |
+#endif |
+ const std::vector<KeySystemInfo::ContainerCodecsPair>& supported_types, |
+ const std::string& parent_key_system); |
+ |
+ |
friend struct base::DefaultLazyInstanceTraits<KeySystems>; |
typedef base::hash_set<std::string> CodecSet; |
@@ -77,7 +81,12 @@ class KeySystems { |
typedef std::map<std::string, std::string> ParentKeySystemMap; |
- KeySystems() {} |
+ KeySystems(); |
+ ~KeySystems() {} |
+ |
+ void AddSupportedType(const std::string& mime_type, |
+ const std::string& codecs_list, |
+ KeySystemProperties* properties); |
bool IsSupportedKeySystemWithContainerAndCodec( |
const std::string& mime_type, |
@@ -96,15 +105,35 @@ class KeySystems { |
static base::LazyInstance<KeySystems> g_key_systems = LAZY_INSTANCE_INITIALIZER; |
-KeySystems* KeySystems::GetInstance() { |
- KeySystems* key_systems = &g_key_systems.Get(); |
- // TODO(ddorwin): Call out to ContentClient to register key systems. |
- static bool is_registered = false; |
- if (!is_registered) { |
- is_registered = true; // Prevent reentrancy when Add*() is called. |
- RegisterKeySystems(); |
+KeySystems& KeySystems::GetInstance() { |
+ return g_key_systems.Get(); |
+} |
+ |
+// Because we use a LazyInstance, the key systems info must be populated when |
+// the instance is lazily initiated. |
+KeySystems::KeySystems() { |
+ std::vector<KeySystemInfo> key_systems_info; |
+ GetContentClient()->renderer()->AddKeySystems(&key_systems_info); |
+ // TODO(ddorwin): Remove in next CL after moving info to |
+ // ChromeContentRendererClient. |
+ AddKeySystems(&key_systems_info); |
+ AddConcreteSupportedKeySystems(key_systems_info); |
+} |
+ |
+void KeySystems::AddConcreteSupportedKeySystems( |
+ const std::vector<KeySystemInfo>& concrete_key_systems) { |
+ for (size_t i = 0; i < concrete_key_systems.size(); ++i) { |
+ const KeySystemInfo& key_system_info = concrete_key_systems[i]; |
+ AddConcreteSupportedKeySystem(key_system_info.key_system, |
+ key_system_info.use_aes_decryptor, |
+#if defined(ENABLE_PEPPER_CDMS) |
+ key_system_info.pepper_type, |
+#elif defined(OS_ANDROID) |
+ key_system_info.uuid, |
+#endif |
+ key_system_info.supported_types, |
+ key_system_info.parent_key_system); |
} |
- return key_systems; |
} |
void KeySystems::AddConcreteSupportedKeySystem( |
@@ -113,11 +142,15 @@ void KeySystems::AddConcreteSupportedKeySystem( |
#if defined(ENABLE_PEPPER_CDMS) |
const std::string& pepper_type, |
#elif defined(OS_ANDROID) |
- const uint8 uuid[16], |
+ const std::vector<uint8>& uuid, |
#endif |
+ const std::vector<KeySystemInfo::ContainerCodecsPair>& supported_types, |
const std::string& parent_key_system) { |
DCHECK(!IsConcreteSupportedKeySystem(concrete_key_system)) |
<< "Key system '" << concrete_key_system << "' already registered"; |
+ DCHECK(parent_key_system_map_.find(concrete_key_system) == |
+ parent_key_system_map_.end()) |
+ << "'" << concrete_key_system << " is already registered as a parent"; |
KeySystemProperties properties; |
properties.use_aes_decryptor = use_aes_decryptor; |
@@ -125,23 +158,33 @@ void KeySystems::AddConcreteSupportedKeySystem( |
DCHECK_EQ(use_aes_decryptor, pepper_type.empty()); |
properties.pepper_type = pepper_type; |
#elif defined(OS_ANDROID) |
- // Since |uuid| can't be empty, use |use_aes_decryptor|. |
- if (!use_aes_decryptor) |
- properties.uuid.assign(uuid, uuid + 16); |
+ DCHECK_EQ(use_aes_decryptor, uuid.empty()); |
+ DCHECK(use_aes_decryptor || uuid.size() == 16); |
+ properties.uuid = uuid; |
#endif |
+ |
+ for (size_t i = 0; i < supported_types.size(); ++i) { |
+ const KeySystemInfo::ContainerCodecsPair& pair = supported_types[i]; |
+ const std::string& mime_type = pair.first; |
+ const std::string& codecs_list = pair.second; |
+ AddSupportedType(mime_type, codecs_list, &properties); |
+ } |
+ |
concrete_key_system_map_[concrete_key_system] = properties; |
if (!parent_key_system.empty()) { |
+ DCHECK(!IsConcreteSupportedKeySystem(parent_key_system)) |
+ << "Parent '" << parent_key_system << "' already registered concrete"; |
DCHECK(parent_key_system_map_.find(parent_key_system) == |
parent_key_system_map_.end()) |
- << "Parent '" << parent_key_system.c_str() << "' already registered."; |
+ << "Parent '" << parent_key_system << "' already registered"; |
parent_key_system_map_[parent_key_system] = concrete_key_system; |
} |
} |
-void KeySystems::AddSupportedType(const std::string& concrete_key_system, |
- const std::string& mime_type, |
- const std::string& codecs_list) { |
+void KeySystems::AddSupportedType(const std::string& mime_type, |
+ const std::string& codecs_list, |
+ KeySystemProperties* properties) { |
std::vector<std::string> mime_type_codecs; |
net::ParseCodecString(codecs_list, &mime_type_codecs, false); |
@@ -149,10 +192,7 @@ void KeySystems::AddSupportedType(const std::string& concrete_key_system, |
// Support the MIME type string alone, without codec(s) specified. |
codecs.insert(std::string()); |
- KeySystemPropertiesMap::iterator key_system_iter = |
- concrete_key_system_map_.find(concrete_key_system); |
- DCHECK(key_system_iter != concrete_key_system_map_.end()); |
- MimeTypeMap& mime_types_map = key_system_iter->second.types; |
+ MimeTypeMap& mime_types_map = properties->types; |
// mime_types_map must not be repeated for a given key system. |
DCHECK(mime_types_map.find(mime_type) == mime_types_map.end()); |
mime_types_map[mime_type] = codecs; |
@@ -254,34 +294,8 @@ std::vector<uint8> KeySystems::GetUUID(const std::string& concrete_key_system) { |
//------------------------------------------------------------------------------ |
-void AddConcreteSupportedKeySystem( |
- const std::string& key_system, |
- bool use_aes_decryptor, |
-#if defined(ENABLE_PEPPER_CDMS) |
- const std::string& pepper_type, |
-#elif defined(OS_ANDROID) |
- const uint8 uuid[16], |
-#endif |
- const std::string& parent_key_system) { |
- KeySystems::GetInstance()->AddConcreteSupportedKeySystem(key_system, |
- use_aes_decryptor, |
-#if defined(ENABLE_PEPPER_CDMS) |
- pepper_type, |
-#elif defined(OS_ANDROID) |
- uuid, |
-#endif |
- parent_key_system); |
-} |
- |
-void AddSupportedType(const std::string& key_system, |
- const std::string& mime_type, |
- const std::string& codecs_list) { |
- KeySystems::GetInstance()->AddSupportedType(key_system, |
- mime_type, codecs_list); |
-} |
- |
bool IsConcreteSupportedKeySystem(const WebKit::WebString& key_system) { |
- return KeySystems::GetInstance()->IsConcreteSupportedKeySystem( |
+ return KeySystems::GetInstance().IsConcreteSupportedKeySystem( |
ToASCIIOrEmpty(key_system)); |
} |
@@ -289,7 +303,7 @@ bool IsSupportedKeySystemWithMediaMimeType( |
const std::string& mime_type, |
const std::vector<std::string>& codecs, |
const std::string& key_system) { |
- return KeySystems::GetInstance()->IsSupportedKeySystemWithMediaMimeType( |
+ return KeySystems::GetInstance().IsSupportedKeySystemWithMediaMimeType( |
mime_type, codecs, key_system); |
} |
@@ -298,16 +312,16 @@ std::string KeySystemNameForUMA(const WebKit::WebString& key_system) { |
} |
bool CanUseAesDecryptor(const std::string& concrete_key_system) { |
- return KeySystems::GetInstance()->UseAesDecryptor(concrete_key_system); |
+ return KeySystems::GetInstance().UseAesDecryptor(concrete_key_system); |
} |
#if defined(ENABLE_PEPPER_CDMS) |
std::string GetPepperType(const std::string& concrete_key_system) { |
- return KeySystems::GetInstance()->GetPepperType(concrete_key_system); |
+ return KeySystems::GetInstance().GetPepperType(concrete_key_system); |
} |
#elif defined(OS_ANDROID) |
std::vector<uint8> GetUUID(const std::string& concrete_key_system) { |
- return KeySystems::GetInstance()->GetUUID(concrete_key_system); |
+ return KeySystems::GetInstance().GetUUID(concrete_key_system); |
} |
#endif |