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 |