Chromium Code Reviews| 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 "content/renderer/media/crypto/key_systems.h" | 5 #include "content/renderer/media/crypto/key_systems.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 | 8 |
| 9 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 51 | 51 |
| 52 #if defined(ENABLE_PEPPER_CDMS) | 52 #if defined(ENABLE_PEPPER_CDMS) |
| 53 std::string GetPepperType(const std::string& concrete_key_system); | 53 std::string GetPepperType(const std::string& concrete_key_system); |
| 54 #elif defined(OS_ANDROID) | 54 #elif defined(OS_ANDROID) |
| 55 std::vector<uint8> GetUUID(const std::string& concrete_key_system); | 55 std::vector<uint8> GetUUID(const std::string& concrete_key_system); |
| 56 #endif | 56 #endif |
| 57 | 57 |
| 58 private: | 58 private: |
| 59 friend struct base::DefaultLazyInstanceTraits<KeySystems>; | 59 friend struct base::DefaultLazyInstanceTraits<KeySystems>; |
| 60 | 60 |
| 61 typedef base::hash_set<std::string> CodecMappings; | 61 typedef base::hash_set<std::string> CodecSet; |
| 62 typedef std::map<std::string, CodecMappings> MimeTypeMappings; | 62 typedef std::map<std::string, CodecSet> MimeTypeMap; |
| 63 | 63 |
| 64 struct KeySystemProperties { | 64 struct KeySystemProperties { |
| 65 KeySystemProperties() : use_aes_decryptor(false) {} | 65 KeySystemProperties() : use_aes_decryptor(false) {} |
| 66 | 66 |
| 67 bool use_aes_decryptor; | 67 bool use_aes_decryptor; |
| 68 #if defined(ENABLE_PEPPER_CDMS) | 68 #if defined(ENABLE_PEPPER_CDMS) |
| 69 std::string pepper_type; | 69 std::string pepper_type; |
| 70 #elif defined(OS_ANDROID) | 70 #elif defined(OS_ANDROID) |
| 71 std::vector<uint8> uuid; | 71 std::vector<uint8> uuid; |
| 72 #endif | 72 #endif |
| 73 MimeTypeMappings types; | 73 MimeTypeMap types; |
| 74 }; | 74 }; |
| 75 | 75 |
| 76 typedef std::map<std::string, KeySystemProperties> KeySystemMappings; | 76 typedef std::map<std::string, KeySystemProperties> KeySystemPropertiesMap; |
| 77 | 77 |
| 78 typedef std::map<std::string, std::string> ParentKeySystemMappings; | 78 typedef std::map<std::string, std::string> ParentKeySystemMap; |
| 79 | 79 |
| 80 KeySystems() {} | 80 KeySystems() {} |
| 81 | 81 |
| 82 bool IsSupportedKeySystemWithContainerAndCodec( | 82 bool IsSupportedKeySystemWithContainerAndCodec( |
| 83 const std::string& mime_type, | 83 const std::string& mime_type, |
| 84 const std::string& codec, | 84 const std::string& codec, |
| 85 const std::string& key_system); | 85 const std::string& key_system); |
| 86 | 86 |
| 87 // Map from key system string to capabilities. | 87 // Map from key system string to capabilities. |
| 88 KeySystemMappings key_system_map_; | 88 KeySystemPropertiesMap concrete_key_system_map_; |
| 89 | 89 |
| 90 // Map from parent key system to the concrete key system that should be used | 90 // Map from parent key system to the concrete key system that should be used |
| 91 // to represent its capabilities. | 91 // to represent its capabilities. |
| 92 ParentKeySystemMappings parent_key_system_map_; | 92 ParentKeySystemMap parent_key_system_map_; |
| 93 | 93 |
| 94 DISALLOW_COPY_AND_ASSIGN(KeySystems); | 94 DISALLOW_COPY_AND_ASSIGN(KeySystems); |
| 95 }; | 95 }; |
| 96 | 96 |
| 97 static base::LazyInstance<KeySystems> g_key_systems = LAZY_INSTANCE_INITIALIZER; | 97 static base::LazyInstance<KeySystems> g_key_systems = LAZY_INSTANCE_INITIALIZER; |
| 98 | 98 |
| 99 KeySystems* KeySystems::GetInstance() { | 99 KeySystems* KeySystems::GetInstance() { |
| 100 KeySystems* key_systems = &g_key_systems.Get(); | 100 KeySystems* key_systems = &g_key_systems.Get(); |
| 101 // TODO(ddorwin): Call out to ContentClient to register key systems. | 101 // TODO(ddorwin): Call out to ContentClient to register key systems. |
| 102 static bool is_registered = false; | 102 static bool is_registered = false; |
| 103 if (!is_registered) { | 103 if (!is_registered) { |
| 104 is_registered = true; // Prevent reentrancy when Add*() is called. | 104 is_registered = true; // Prevent reentrancy when Add*() is called. |
| 105 RegisterKeySystems(); | 105 RegisterKeySystems(); |
| 106 } | 106 } |
| 107 return key_systems; | 107 return key_systems; |
| 108 } | 108 } |
| 109 | 109 |
| 110 // TODO(ddorwin): Change first parameter to |concrete_key_system|. | |
| 111 void KeySystems::AddConcreteSupportedKeySystem( | 110 void KeySystems::AddConcreteSupportedKeySystem( |
| 112 const std::string& key_system, | 111 const std::string& concrete_key_system, |
| 113 bool use_aes_decryptor, | 112 bool use_aes_decryptor, |
| 114 #if defined(ENABLE_PEPPER_CDMS) | 113 #if defined(ENABLE_PEPPER_CDMS) |
| 115 const std::string& pepper_type, | 114 const std::string& pepper_type, |
| 116 #elif defined(OS_ANDROID) | 115 #elif defined(OS_ANDROID) |
| 117 const uint8 uuid[16], | 116 const uint8 uuid[16], |
| 118 #endif | 117 #endif |
| 119 const std::string& parent_key_system) { | 118 const std::string& parent_key_system) { |
| 120 DCHECK(!IsConcreteSupportedKeySystem(key_system)) | 119 DCHECK(!IsConcreteSupportedKeySystem(concrete_key_system)) |
| 121 << "Key system '" << key_system << "' already registered"; | 120 << "Key system '" << concrete_key_system << "' already registered"; |
| 122 | 121 |
| 123 KeySystemProperties properties; | 122 KeySystemProperties properties; |
| 124 properties.use_aes_decryptor = use_aes_decryptor; | 123 properties.use_aes_decryptor = use_aes_decryptor; |
| 125 #if defined(ENABLE_PEPPER_CDMS) | 124 #if defined(ENABLE_PEPPER_CDMS) |
| 126 DCHECK_EQ(use_aes_decryptor, pepper_type.empty()); | 125 DCHECK_EQ(use_aes_decryptor, pepper_type.empty()); |
| 127 properties.pepper_type = pepper_type; | 126 properties.pepper_type = pepper_type; |
| 128 #elif defined(OS_ANDROID) | 127 #elif defined(OS_ANDROID) |
| 129 properties.uuid.assign(uuid, uuid + 16); | 128 properties.uuid.assign(uuid, uuid + 16); |
| 130 #endif | 129 #endif |
| 131 key_system_map_[key_system] = properties; | 130 concrete_key_system_map_[concrete_key_system] = properties; |
| 132 | 131 |
| 133 if (!parent_key_system.empty()) { | 132 if (!parent_key_system.empty()) { |
| 134 DCHECK(parent_key_system_map_.find(parent_key_system) == | 133 DCHECK(parent_key_system_map_.find(parent_key_system) == |
| 135 parent_key_system_map_.end()) | 134 parent_key_system_map_.end()) |
| 136 << "Parent '" << parent_key_system.c_str() << "' already registered."; | 135 << "Parent '" << parent_key_system.c_str() << "' already registered."; |
| 137 parent_key_system_map_[parent_key_system] = key_system; | 136 parent_key_system_map_[parent_key_system] = concrete_key_system; |
| 138 } | 137 } |
| 139 } | 138 } |
| 140 | 139 |
| 141 // TODO(ddorwin): Change first parameter to |concrete_key_system|. | 140 void KeySystems::AddSupportedType(const std::string& concrete_key_system, |
| 142 void KeySystems::AddSupportedType(const std::string& key_system, | |
| 143 const std::string& mime_type, | 141 const std::string& mime_type, |
| 144 const std::string& codecs_list) { | 142 const std::string& codecs_list) { |
| 145 std::vector<std::string> mime_type_codecs; | 143 std::vector<std::string> mime_type_codecs; |
| 146 net::ParseCodecString(codecs_list, &mime_type_codecs, false); | 144 net::ParseCodecString(codecs_list, &mime_type_codecs, false); |
| 147 | 145 |
| 148 CodecMappings codecs(mime_type_codecs.begin(), mime_type_codecs.end()); | 146 CodecSet codecs(mime_type_codecs.begin(), mime_type_codecs.end()); |
|
xhwang
2013/08/29 23:16:19
indent
ddorwin
2013/08/30 21:47:43
Done.
| |
| 149 // Support the MIME type string alone, without codec(s) specified. | 147 // Support the MIME type string alone, without codec(s) specified. |
| 150 codecs.insert(std::string()); | 148 codecs.insert(std::string()); |
| 151 | 149 |
| 152 KeySystemMappings::iterator key_system_iter = | 150 KeySystemPropertiesMap::iterator key_system_iter = |
| 153 key_system_map_.find(key_system); | 151 concrete_key_system_map_.find(concrete_key_system); |
| 154 DCHECK(key_system_iter != key_system_map_.end()); | 152 DCHECK(key_system_iter != concrete_key_system_map_.end()); |
| 155 MimeTypeMappings& mime_types_map = key_system_iter->second.types; | 153 MimeTypeMap& mime_types_map = key_system_iter->second.types; |
| 156 // mime_types_map must not be repeated for a given key system. | 154 // mime_types_map must not be repeated for a given key system. |
| 157 DCHECK(mime_types_map.find(mime_type) == mime_types_map.end()); | 155 DCHECK(mime_types_map.find(mime_type) == mime_types_map.end()); |
| 158 mime_types_map[mime_type] = codecs; | 156 mime_types_map[mime_type] = codecs; |
| 159 } | 157 } |
| 160 | 158 |
| 161 bool KeySystems::IsConcreteSupportedKeySystem(const std::string& key_system) { | 159 bool KeySystems::IsConcreteSupportedKeySystem(const std::string& key_system) { |
| 162 return key_system_map_.find(key_system) != key_system_map_.end(); | 160 return concrete_key_system_map_.find(key_system) != |
| 161 concrete_key_system_map_.end(); | |
| 163 } | 162 } |
| 164 | 163 |
| 165 bool KeySystems::IsSupportedKeySystemWithContainerAndCodec( | 164 bool KeySystems::IsSupportedKeySystemWithContainerAndCodec( |
| 166 const std::string& mime_type, | 165 const std::string& mime_type, |
| 167 const std::string& codec, | 166 const std::string& codec, |
| 168 const std::string& key_system) { | 167 const std::string& key_system) { |
| 169 KeySystemMappings::const_iterator key_system_iter = | 168 KeySystemPropertiesMap::const_iterator key_system_iter = |
| 170 key_system_map_.find(key_system); | 169 concrete_key_system_map_.find(key_system); |
| 171 if (key_system_iter == key_system_map_.end()) | 170 if (key_system_iter == concrete_key_system_map_.end()) |
| 172 return false; | 171 return false; |
| 173 | 172 |
| 174 const MimeTypeMappings& mime_types_map = key_system_iter->second.types; | 173 const MimeTypeMap& mime_types_map = key_system_iter->second.types; |
| 175 MimeTypeMappings::const_iterator mime_iter = mime_types_map.find(mime_type); | 174 MimeTypeMap::const_iterator mime_iter = mime_types_map.find(mime_type); |
| 176 if (mime_iter == mime_types_map.end()) | 175 if (mime_iter == mime_types_map.end()) |
| 177 return false; | 176 return false; |
| 178 | 177 |
| 179 const CodecMappings& codecs = mime_iter->second; | 178 const CodecSet& codecs = mime_iter->second; |
| 180 return (codecs.find(codec) != codecs.end()); | 179 return (codecs.find(codec) != codecs.end()); |
| 181 } | 180 } |
| 182 | 181 |
| 183 bool KeySystems::IsSupportedKeySystemWithMediaMimeType( | 182 bool KeySystems::IsSupportedKeySystemWithMediaMimeType( |
| 184 const std::string& mime_type, | 183 const std::string& mime_type, |
| 185 const std::vector<std::string>& codecs, | 184 const std::vector<std::string>& codecs, |
| 186 const std::string& key_system) { | 185 const std::string& key_system) { |
| 187 // If |key_system| is a parent key_system, use its concrete child. | 186 // If |key_system| is a parent key_system, use its concrete child. |
| 188 // Otherwise, use |key_system|. | 187 // Otherwise, use |key_system|. |
| 189 std::string concrete_key_system; | 188 std::string concrete_key_system; |
| 190 ParentKeySystemMappings::iterator parent_key_system_iter = | 189 ParentKeySystemMap::iterator parent_key_system_iter = |
| 191 parent_key_system_map_.find(key_system); | 190 parent_key_system_map_.find(key_system); |
| 192 if (parent_key_system_iter != parent_key_system_map_.end()) | 191 if (parent_key_system_iter != parent_key_system_map_.end()) |
| 193 concrete_key_system = parent_key_system_iter->second; | 192 concrete_key_system = parent_key_system_iter->second; |
| 194 else | 193 else |
| 195 concrete_key_system = key_system; | 194 concrete_key_system = key_system; |
| 196 | 195 |
| 197 // This method is only used by the canPlaytType() path (not the EME methods), | 196 // This method is only used by the canPlaytType() path (not the EME methods), |
| 198 // so we check for suppressed key_systems here. | 197 // so we check for suppressed key_systems here. |
| 199 if(IsCanPlayTypeSuppressed(concrete_key_system)) | 198 if(IsCanPlayTypeSuppressed(concrete_key_system)) |
| 200 return false; | 199 return false; |
| 201 | 200 |
| 202 if (codecs.empty()) { | 201 if (codecs.empty()) { |
| 203 return IsSupportedKeySystemWithContainerAndCodec( | 202 return IsSupportedKeySystemWithContainerAndCodec( |
| 204 mime_type, std::string(), concrete_key_system); | 203 mime_type, std::string(), concrete_key_system); |
| 205 } | 204 } |
| 206 | 205 |
| 207 for (size_t i = 0; i < codecs.size(); ++i) { | 206 for (size_t i = 0; i < codecs.size(); ++i) { |
| 208 if (!IsSupportedKeySystemWithContainerAndCodec( | 207 if (!IsSupportedKeySystemWithContainerAndCodec( |
| 209 mime_type, codecs[i], concrete_key_system)) { | 208 mime_type, codecs[i], concrete_key_system)) { |
| 210 return false; | 209 return false; |
| 211 } | 210 } |
| 212 } | 211 } |
| 213 | 212 |
| 214 return true; | 213 return true; |
| 215 } | 214 } |
| 216 | 215 |
| 217 bool KeySystems::UseAesDecryptor(const std::string& concrete_key_system) { | 216 bool KeySystems::UseAesDecryptor(const std::string& concrete_key_system) { |
| 218 KeySystemMappings::iterator key_system_iter = | 217 KeySystemPropertiesMap::iterator key_system_iter = |
| 219 key_system_map_.find(concrete_key_system); | 218 concrete_key_system_map_.find(concrete_key_system); |
| 220 DCHECK(key_system_iter != key_system_map_.end()) | 219 DCHECK(key_system_iter != concrete_key_system_map_.end()) |
| 221 << concrete_key_system << " is not a known concrete system"; | 220 << concrete_key_system << " is not a known concrete system"; |
| 222 return key_system_iter->second.use_aes_decryptor; | 221 return key_system_iter->second.use_aes_decryptor; |
| 223 } | 222 } |
| 224 | 223 |
| 225 #if defined(ENABLE_PEPPER_CDMS) | 224 #if defined(ENABLE_PEPPER_CDMS) |
| 226 std::string KeySystems::GetPepperType(const std::string& concrete_key_system) { | 225 std::string KeySystems::GetPepperType(const std::string& concrete_key_system) { |
| 227 KeySystemMappings::iterator key_system_iter = | 226 KeySystemPropertiesMap::iterator key_system_iter = |
| 228 key_system_map_.find(concrete_key_system); | 227 concrete_key_system_map_.find(concrete_key_system); |
| 229 DCHECK(key_system_iter != key_system_map_.end()) | 228 DCHECK(key_system_iter != concrete_key_system_map_.end()) |
| 230 << concrete_key_system << " is not a known concrete system"; | 229 << concrete_key_system << " is not a known concrete system"; |
| 231 const std::string& type = key_system_iter->second.pepper_type; | 230 const std::string& type = key_system_iter->second.pepper_type; |
| 232 DCHECK(!type.empty()) << concrete_key_system << " is not Pepper-based"; | 231 DCHECK(!type.empty()) << concrete_key_system << " is not Pepper-based"; |
| 233 return type; | 232 return type; |
| 234 } | 233 } |
| 235 #elif defined(OS_ANDROID) | 234 #elif defined(OS_ANDROID) |
| 236 std::vector<uint8> KeySystems::GetUUID(const std::string& concrete_key_system) { | 235 std::vector<uint8> KeySystems::GetUUID(const std::string& concrete_key_system) { |
| 237 KeySystemMappings::iterator key_system_iter = | 236 KeySystemPropertiesMap::iterator key_system_iter = |
| 238 key_system_map_.find(concrete_key_system); | 237 concrete_key_system_map_.find(concrete_key_system); |
| 239 DCHECK(key_system_iter != key_system_map_.end()) | 238 DCHECK(key_system_iter != concrete_key_system_map_.end()) |
| 240 << concrete_key_system << " is not a known concrete system"; | 239 << concrete_key_system << " is not a known concrete system"; |
| 241 return key_system_iter->second.uuid; | 240 return key_system_iter->second.uuid; |
| 242 } | 241 } |
| 243 #endif | 242 #endif |
| 244 | 243 |
| 245 //------------------------------------------------------------------------------ | 244 //------------------------------------------------------------------------------ |
| 246 | 245 |
| 247 void AddConcreteSupportedKeySystem( | 246 void AddConcreteSupportedKeySystem( |
| 248 const std::string& key_system, | 247 const std::string& key_system, |
| 249 bool use_aes_decryptor, | 248 bool use_aes_decryptor, |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 295 std::string GetPepperType(const std::string& concrete_key_system) { | 294 std::string GetPepperType(const std::string& concrete_key_system) { |
| 296 return KeySystems::GetInstance()->GetPepperType(concrete_key_system); | 295 return KeySystems::GetInstance()->GetPepperType(concrete_key_system); |
| 297 } | 296 } |
| 298 #elif defined(OS_ANDROID) | 297 #elif defined(OS_ANDROID) |
| 299 std::vector<uint8> GetUUID(const std::string& concrete_key_system) { | 298 std::vector<uint8> GetUUID(const std::string& concrete_key_system) { |
| 300 return KeySystems::GetInstance()->GetUUID(concrete_key_system); | 299 return KeySystems::GetInstance()->GetUUID(concrete_key_system); |
| 301 } | 300 } |
| 302 #endif | 301 #endif |
| 303 | 302 |
| 304 } // namespace content | 303 } // namespace content |
| OLD | NEW |