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

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: 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 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
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
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