Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(150)

Side by Side Diff: content/renderer/media/crypto/key_systems.cc

Issue 23708010: Address deferred comments from https://codereview.chromium.org/23464005/ (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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 // Since |uuid| can't be empty, use |use_aes_decryptor|. 128 // Since |uuid| can't be empty, use |use_aes_decryptor|.
130 if (!use_aes_decryptor) 129 if (!use_aes_decryptor)
131 properties.uuid.assign(uuid, uuid + 16); 130 properties.uuid.assign(uuid, uuid + 16);
132 #endif 131 #endif
133 key_system_map_[key_system] = properties; 132 concrete_key_system_map_[concrete_key_system] = properties;
134 133
135 if (!parent_key_system.empty()) { 134 if (!parent_key_system.empty()) {
136 DCHECK(parent_key_system_map_.find(parent_key_system) == 135 DCHECK(parent_key_system_map_.find(parent_key_system) ==
137 parent_key_system_map_.end()) 136 parent_key_system_map_.end())
138 << "Parent '" << parent_key_system.c_str() << "' already registered."; 137 << "Parent '" << parent_key_system.c_str() << "' already registered.";
139 parent_key_system_map_[parent_key_system] = key_system; 138 parent_key_system_map_[parent_key_system] = concrete_key_system;
140 } 139 }
141 } 140 }
142 141
143 // TODO(ddorwin): Change first parameter to |concrete_key_system|. 142 void KeySystems::AddSupportedType(const std::string& concrete_key_system,
144 void KeySystems::AddSupportedType(const std::string& key_system,
145 const std::string& mime_type, 143 const std::string& mime_type,
146 const std::string& codecs_list) { 144 const std::string& codecs_list) {
147 std::vector<std::string> mime_type_codecs; 145 std::vector<std::string> mime_type_codecs;
148 net::ParseCodecString(codecs_list, &mime_type_codecs, false); 146 net::ParseCodecString(codecs_list, &mime_type_codecs, false);
149 147
150 CodecMappings codecs(mime_type_codecs.begin(), mime_type_codecs.end()); 148 CodecSet codecs(mime_type_codecs.begin(), mime_type_codecs.end());
151 // Support the MIME type string alone, without codec(s) specified. 149 // Support the MIME type string alone, without codec(s) specified.
152 codecs.insert(std::string()); 150 codecs.insert(std::string());
153 151
154 KeySystemMappings::iterator key_system_iter = 152 KeySystemPropertiesMap::iterator key_system_iter =
155 key_system_map_.find(key_system); 153 concrete_key_system_map_.find(concrete_key_system);
156 DCHECK(key_system_iter != key_system_map_.end()); 154 DCHECK(key_system_iter != concrete_key_system_map_.end());
157 MimeTypeMappings& mime_types_map = key_system_iter->second.types; 155 MimeTypeMap& mime_types_map = key_system_iter->second.types;
158 // mime_types_map must not be repeated for a given key system. 156 // mime_types_map must not be repeated for a given key system.
159 DCHECK(mime_types_map.find(mime_type) == mime_types_map.end()); 157 DCHECK(mime_types_map.find(mime_type) == mime_types_map.end());
160 mime_types_map[mime_type] = codecs; 158 mime_types_map[mime_type] = codecs;
161 } 159 }
162 160
163 bool KeySystems::IsConcreteSupportedKeySystem(const std::string& key_system) { 161 bool KeySystems::IsConcreteSupportedKeySystem(const std::string& key_system) {
164 return key_system_map_.find(key_system) != key_system_map_.end(); 162 return concrete_key_system_map_.find(key_system) !=
163 concrete_key_system_map_.end();
165 } 164 }
166 165
167 bool KeySystems::IsSupportedKeySystemWithContainerAndCodec( 166 bool KeySystems::IsSupportedKeySystemWithContainerAndCodec(
168 const std::string& mime_type, 167 const std::string& mime_type,
169 const std::string& codec, 168 const std::string& codec,
170 const std::string& key_system) { 169 const std::string& key_system) {
171 KeySystemMappings::const_iterator key_system_iter = 170 KeySystemPropertiesMap::const_iterator key_system_iter =
172 key_system_map_.find(key_system); 171 concrete_key_system_map_.find(key_system);
173 if (key_system_iter == key_system_map_.end()) 172 if (key_system_iter == concrete_key_system_map_.end())
174 return false; 173 return false;
175 174
176 const MimeTypeMappings& mime_types_map = key_system_iter->second.types; 175 const MimeTypeMap& mime_types_map = key_system_iter->second.types;
177 MimeTypeMappings::const_iterator mime_iter = mime_types_map.find(mime_type); 176 MimeTypeMap::const_iterator mime_iter = mime_types_map.find(mime_type);
178 if (mime_iter == mime_types_map.end()) 177 if (mime_iter == mime_types_map.end())
179 return false; 178 return false;
180 179
181 const CodecMappings& codecs = mime_iter->second; 180 const CodecSet& codecs = mime_iter->second;
182 return (codecs.find(codec) != codecs.end()); 181 return (codecs.find(codec) != codecs.end());
183 } 182 }
184 183
185 bool KeySystems::IsSupportedKeySystemWithMediaMimeType( 184 bool KeySystems::IsSupportedKeySystemWithMediaMimeType(
186 const std::string& mime_type, 185 const std::string& mime_type,
187 const std::vector<std::string>& codecs, 186 const std::vector<std::string>& codecs,
188 const std::string& key_system) { 187 const std::string& key_system) {
189 // If |key_system| is a parent key_system, use its concrete child. 188 // If |key_system| is a parent key_system, use its concrete child.
190 // Otherwise, use |key_system|. 189 // Otherwise, use |key_system|.
191 std::string concrete_key_system; 190 std::string concrete_key_system;
192 ParentKeySystemMappings::iterator parent_key_system_iter = 191 ParentKeySystemMap::iterator parent_key_system_iter =
193 parent_key_system_map_.find(key_system); 192 parent_key_system_map_.find(key_system);
194 if (parent_key_system_iter != parent_key_system_map_.end()) 193 if (parent_key_system_iter != parent_key_system_map_.end())
195 concrete_key_system = parent_key_system_iter->second; 194 concrete_key_system = parent_key_system_iter->second;
196 else 195 else
197 concrete_key_system = key_system; 196 concrete_key_system = key_system;
198 197
199 // This method is only used by the canPlaytType() path (not the EME methods), 198 // This method is only used by the canPlaytType() path (not the EME methods),
200 // so we check for suppressed key_systems here. 199 // so we check for suppressed key_systems here.
201 if(IsCanPlayTypeSuppressed(concrete_key_system)) 200 if(IsCanPlayTypeSuppressed(concrete_key_system))
202 return false; 201 return false;
203 202
204 if (codecs.empty()) { 203 if (codecs.empty()) {
205 return IsSupportedKeySystemWithContainerAndCodec( 204 return IsSupportedKeySystemWithContainerAndCodec(
206 mime_type, std::string(), concrete_key_system); 205 mime_type, std::string(), concrete_key_system);
207 } 206 }
208 207
209 for (size_t i = 0; i < codecs.size(); ++i) { 208 for (size_t i = 0; i < codecs.size(); ++i) {
210 if (!IsSupportedKeySystemWithContainerAndCodec( 209 if (!IsSupportedKeySystemWithContainerAndCodec(
211 mime_type, codecs[i], concrete_key_system)) { 210 mime_type, codecs[i], concrete_key_system)) {
212 return false; 211 return false;
213 } 212 }
214 } 213 }
215 214
216 return true; 215 return true;
217 } 216 }
218 217
219 bool KeySystems::UseAesDecryptor(const std::string& concrete_key_system) { 218 bool KeySystems::UseAesDecryptor(const std::string& concrete_key_system) {
220 KeySystemMappings::iterator key_system_iter = 219 KeySystemPropertiesMap::iterator key_system_iter =
221 key_system_map_.find(concrete_key_system); 220 concrete_key_system_map_.find(concrete_key_system);
222 if (key_system_iter == key_system_map_.end()) { 221 if (key_system_iter == concrete_key_system_map_.end()) {
223 DLOG(FATAL) << concrete_key_system << " is not a known concrete system"; 222 DLOG(FATAL) << concrete_key_system << " is not a known concrete system";
224 return false; 223 return false;
225 } 224 }
226 225
227 return key_system_iter->second.use_aes_decryptor; 226 return key_system_iter->second.use_aes_decryptor;
228 } 227 }
229 228
230 #if defined(ENABLE_PEPPER_CDMS) 229 #if defined(ENABLE_PEPPER_CDMS)
231 std::string KeySystems::GetPepperType(const std::string& concrete_key_system) { 230 std::string KeySystems::GetPepperType(const std::string& concrete_key_system) {
232 KeySystemMappings::iterator key_system_iter = 231 KeySystemPropertiesMap::iterator key_system_iter =
233 key_system_map_.find(concrete_key_system); 232 concrete_key_system_map_.find(concrete_key_system);
234 if (key_system_iter == key_system_map_.end()) { 233 if (key_system_iter == concrete_key_system_map_.end()) {
235 DLOG(FATAL) << concrete_key_system << " is not a known concrete system"; 234 DLOG(FATAL) << concrete_key_system << " is not a known concrete system";
236 return std::string(); 235 return std::string();
237 } 236 }
238 237
239 const std::string& type = key_system_iter->second.pepper_type; 238 const std::string& type = key_system_iter->second.pepper_type;
240 DLOG_IF(FATAL, type.empty()) << concrete_key_system << " is not Pepper-based"; 239 DLOG_IF(FATAL, type.empty()) << concrete_key_system << " is not Pepper-based";
241 return type; 240 return type;
242 } 241 }
243 #elif defined(OS_ANDROID) 242 #elif defined(OS_ANDROID)
244 std::vector<uint8> KeySystems::GetUUID(const std::string& concrete_key_system) { 243 std::vector<uint8> KeySystems::GetUUID(const std::string& concrete_key_system) {
245 KeySystemMappings::iterator key_system_iter = 244 KeySystemPropertiesMap::iterator key_system_iter =
246 key_system_map_.find(concrete_key_system); 245 concrete_key_system_map_.find(concrete_key_system);
247 if (key_system_iter == key_system_map_.end()) { 246 if (key_system_iter == concrete_key_system_map_.end()) {
248 DLOG(FATAL) << concrete_key_system << " is not a known concrete system"; 247 DLOG(FATAL) << concrete_key_system << " is not a known concrete system";
249 return std::vector<uint8>(); 248 return std::vector<uint8>();
250 } 249 }
251 250
252 return key_system_iter->second.uuid; 251 return key_system_iter->second.uuid;
253 } 252 }
254 #endif 253 #endif
255 254
256 //------------------------------------------------------------------------------ 255 //------------------------------------------------------------------------------
257 256
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
306 std::string GetPepperType(const std::string& concrete_key_system) { 305 std::string GetPepperType(const std::string& concrete_key_system) {
307 return KeySystems::GetInstance()->GetPepperType(concrete_key_system); 306 return KeySystems::GetInstance()->GetPepperType(concrete_key_system);
308 } 307 }
309 #elif defined(OS_ANDROID) 308 #elif defined(OS_ANDROID)
310 std::vector<uint8> GetUUID(const std::string& concrete_key_system) { 309 std::vector<uint8> GetUUID(const std::string& concrete_key_system) {
311 return KeySystems::GetInstance()->GetUUID(concrete_key_system); 310 return KeySystems::GetInstance()->GetUUID(concrete_key_system);
312 } 311 }
313 #endif 312 #endif
314 313
315 } // namespace content 314 } // namespace content
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698