Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "webkit/media/crypto/key_systems.h" | 5 #include "webkit/media/crypto/key_systems.h" |
| 6 | 6 |
| 7 #include "media/base/decryptor.h" | |
| 8 #include "media/crypto/aes_decryptor.h" | |
| 9 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebString.h" | 7 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebString.h" |
| 10 | 8 |
| 11 namespace webkit_media { | 9 namespace webkit_media { |
| 12 | 10 |
| 13 namespace { | 11 namespace { |
| 14 | 12 |
| 15 const char kClearKeyKeySystem[] = "webkit-org.w3.clearkey"; | 13 const char kClearKeyKeySystem[] = "webkit-org.w3.clearkey"; |
| 14 const char kExternalClearKeyKeySystem[] = "org.chromium.external-clearkey"; | |
|
ddorwin
2012/07/19 01:12:34
Not sure whether we should use a '-'. I guess it's
xhwang
2012/07/19 15:54:34
Done.
| |
| 16 | 15 |
| 17 struct MediaFormatAndKeySystem { | 16 struct MediaFormatAndKeySystem { |
| 18 const char* mime_type; | 17 const char* mime_type; |
| 19 const char* codec; | 18 const char* codec; |
| 20 const char* key_system; | 19 const char* key_system; |
| 21 }; | 20 }; |
| 22 | 21 |
| 22 struct KeySystemPluginTypePair { | |
| 23 const char* key_system; | |
| 24 const char* plugin_type; | |
| 25 }; | |
| 26 | |
| 23 static const MediaFormatAndKeySystem | 27 static const MediaFormatAndKeySystem |
|
xhwang
2012/07/19 15:54:34
We have both anonymous namespace and static functi
ddorwin
2012/07/19 20:50:09
SG. I guess both are allowed (last paragraph): htt
xhwang
2012/07/19 21:54:03
Done.
| |
| 24 supported_format_key_system_combinations[] = { | 28 supported_format_key_system_combinations[] = { |
| 25 // TODO(ddorwin): Reconsider based on how usage of this class evolves. | 29 // TODO(ddorwin): Reconsider based on how usage of this class evolves. |
| 26 // For now, this class is stateless, so we do not have the opportunity to | 30 // For now, this class is stateless, so we do not have the opportunity to |
| 27 // build a list using ParseCodecString() like | 31 // build a list using ParseCodecString() like |
| 28 // net::MimeUtil::InitializeMimeTypeMaps(). Therfore, the following line must | 32 // net::MimeUtil::InitializeMimeTypeMaps(). Therefore, the following line must |
| 29 // be separate entries. | 33 // be separate entries. |
| 30 // { "video/webm", "vorbis,vp8,vp8.0", kClearKeyKeySystem }, | 34 // { "video/webm", "vorbis,vp8,vp8.0", kClearKeyKeySystem }, |
| 31 { "video/webm", "vorbis", kClearKeyKeySystem }, | 35 { "video/webm", "vorbis", kClearKeyKeySystem }, |
| 32 { "video/webm", "vp8", kClearKeyKeySystem }, | 36 { "video/webm", "vp8", kClearKeyKeySystem }, |
| 33 { "video/webm", "vp8.0", kClearKeyKeySystem }, | 37 { "video/webm", "vp8.0", kClearKeyKeySystem }, |
| 34 { "audio/webm", "vorbis", kClearKeyKeySystem }, | 38 { "audio/webm", "vorbis", kClearKeyKeySystem }, |
| 35 { "video/webm", "", kClearKeyKeySystem }, | 39 { "video/webm", "", kClearKeyKeySystem }, |
| 36 { "audio/webm", "", kClearKeyKeySystem } | 40 { "audio/webm", "", kClearKeyKeySystem }, |
| 41 { "video/webm", "vorbis", kExternalClearKeyKeySystem }, | |
| 42 { "video/webm", "vp8", kExternalClearKeyKeySystem }, | |
| 43 { "video/webm", "vp8.0", kExternalClearKeyKeySystem }, | |
| 44 { "audio/webm", "vorbis", kExternalClearKeyKeySystem }, | |
| 45 { "video/webm", "", kExternalClearKeyKeySystem }, | |
| 46 { "audio/webm", "", kExternalClearKeyKeySystem } | |
| 47 }; | |
| 48 | |
| 49 static const KeySystemPluginTypePair key_system_to_plugin_type_mapping[] = { | |
| 50 // TODO(xhwang): Update this with the real plugin name. | |
| 51 { kExternalClearKeyKeySystem, "application/x-ppapi-example" } | |
| 37 }; | 52 }; |
| 38 | 53 |
| 39 bool IsSupportedKeySystemWithContainerAndCodec(const std::string& mime_type, | 54 bool IsSupportedKeySystemWithContainerAndCodec(const std::string& mime_type, |
| 40 const std::string& codec, | 55 const std::string& codec, |
| 41 const std::string& key_system) { | 56 const std::string& key_system) { |
| 42 for (size_t i = 0; | 57 for (size_t i = 0; |
| 43 i < arraysize(supported_format_key_system_combinations); | 58 i < arraysize(supported_format_key_system_combinations); |
| 44 ++i) { | 59 ++i) { |
| 45 const MediaFormatAndKeySystem& combination = | 60 const MediaFormatAndKeySystem& combination = |
| 46 supported_format_key_system_combinations[i]; | 61 supported_format_key_system_combinations[i]; |
| 47 if (combination.mime_type == mime_type && | 62 if (combination.mime_type == mime_type && |
| 48 combination.codec == codec && | 63 combination.codec == codec && |
| 49 combination.key_system == key_system) | 64 combination.key_system == key_system) |
| 50 return true; | 65 return true; |
| 51 } | 66 } |
| 52 | 67 |
| 53 return false; | 68 return false; |
| 54 } | 69 } |
| 55 | 70 |
| 56 } // namespace | 71 } // namespace |
| 57 | 72 |
| 58 bool IsSupportedKeySystem(const WebKit::WebString& key_system) { | 73 bool IsSupportedKeySystem(const WebKit::WebString& key_system) { |
| 59 if (key_system == kClearKeyKeySystem) | 74 if (key_system == kClearKeyKeySystem || |
|
ddorwin
2012/07/19 01:12:34
We _could_ replace this with:
if (CanUseAesDecry
xhwang
2012/07/19 15:54:34
Done.
| |
| 75 key_system == kExternalClearKeyKeySystem) | |
| 60 return true; | 76 return true; |
| 61 return false; | 77 return false; |
| 62 } | 78 } |
| 63 | 79 |
| 64 bool IsSupportedKeySystemWithMediaMimeType( | 80 bool IsSupportedKeySystemWithMediaMimeType( |
| 65 const std::string& mime_type, | 81 const std::string& mime_type, |
| 66 const std::vector<std::string>& codecs, | 82 const std::vector<std::string>& codecs, |
| 67 const std::string& key_system) { | 83 const std::string& key_system) { |
| 68 if (codecs.empty()) | 84 if (codecs.empty()) |
| 69 return IsSupportedKeySystemWithContainerAndCodec(mime_type, "", key_system); | 85 return IsSupportedKeySystemWithContainerAndCodec(mime_type, "", key_system); |
| 70 | 86 |
| 71 for (size_t i = 0; i < codecs.size(); ++i) { | 87 for (size_t i = 0; i < codecs.size(); ++i) { |
| 72 if (!IsSupportedKeySystemWithContainerAndCodec( | 88 if (!IsSupportedKeySystemWithContainerAndCodec( |
| 73 mime_type, codecs[i], key_system)) | 89 mime_type, codecs[i], key_system)) |
| 74 return false; | 90 return false; |
| 75 } | 91 } |
| 76 | 92 |
| 77 return true; | 93 return true; |
| 78 } | 94 } |
| 79 | 95 |
| 80 scoped_ptr<media::Decryptor> CreateDecryptor(const std::string& key_system, | 96 bool CanUseAesDecryptor(const std::string& key_system) { |
| 81 media::DecryptorClient* client) { | 97 return key_system == kClearKeyKeySystem; |
| 82 if (key_system == kClearKeyKeySystem) | 98 } |
| 83 return scoped_ptr<media::Decryptor>(new media::AesDecryptor(client)); | 99 |
| 84 return scoped_ptr<media::Decryptor>(); | 100 const char* GetPluginType(const std::string& key_system) { |
| 101 for (size_t i = 0; i < arraysize(key_system_to_plugin_type_mapping); ++i) { | |
| 102 if (key_system_to_plugin_type_mapping[i].key_system == key_system) | |
| 103 return key_system_to_plugin_type_mapping[i].plugin_type; | |
| 104 } | |
| 105 | |
| 106 return NULL; | |
| 85 } | 107 } |
| 86 | 108 |
| 87 } // namespace webkit_media | 109 } // namespace webkit_media |
| OLD | NEW |