Chromium Code Reviews| Index: content/renderer/media/crypto/key_systems.cc |
| diff --git a/content/renderer/media/crypto/key_systems.cc b/content/renderer/media/crypto/key_systems.cc |
| index a15e0b3578172be5e3ddcbaa4dc6e41a307ebf21..8acbf35060aaa0aefbda764a6a069fe43273eebb 100644 |
| --- a/content/renderer/media/crypto/key_systems.cc |
| +++ b/content/renderer/media/crypto/key_systems.cc |
| @@ -14,6 +14,7 @@ |
| #include "base/time/time.h" |
| #include "content/public/common/content_client.h" |
| #include "content/public/common/eme_codec.h" |
| +#include "content/public/common/eme_init_data_type.h" |
| #include "content/public/renderer/content_renderer_client.h" |
| #include "content/public/renderer/key_system_info.h" |
| #include "content/renderer/media/crypto/key_systems_support_uma.h" |
| @@ -35,6 +36,11 @@ struct CodecMask { |
| EmeCodec mask; |
| }; |
| +struct InitDataTypeMask { |
|
ddorwin
2014/09/13 01:20:45
nit: move IDT stuff before container and codec to
sandersd (OOO until July 31)
2014/09/22 23:45:53
Done.
|
| + const char* type; |
| + EmeInitDataType mask; |
|
ddorwin
2014/09/13 01:20:45
This seems like more of a type string to enum map.
sandersd (OOO until July 31)
2014/09/22 23:45:52
I had a go at renaming these, hopefully it's bette
|
| +}; |
| + |
| // Mapping between container types and the masks of associated codecs. |
| // Only audio codec can belong to a "audio/*" container. Both audio and video |
| // codecs can belong to a "video/*" container. |
| @@ -61,6 +67,13 @@ CodecMask kCodecMasks[] = { |
| #endif // defined(USE_PROPRIETARY_CODECS) |
| }; |
| +// Mapping between initialization data types and their masks. |
|
ddorwin
2014/09/13 01:20:45
ditto on moving
sandersd (OOO until July 31)
2014/09/22 23:45:53
Done.
|
| +InitDataTypeMask kInitDataTypeMasks[] = { |
| + {"cenc", EME_INIT_DATA_TYPE_CENC}, |
|
ddorwin
2014/09/13 03:51:05
This is a straight conversion and never depends on
sandersd (OOO until July 31)
2014/09/22 23:45:53
We can, but then blink needs to know what the supp
ddorwin
2014/09/23 22:48:15
I think it's probably reasonable for Blink to know
|
| + {"webm", EME_INIT_DATA_TYPE_WEBM}, |
| + {"keyids", EME_INIT_DATA_TYPE_KEYIDS}, |
| +}; |
| + |
| static void AddClearKey(std::vector<KeySystemInfo>* concrete_key_systems) { |
| KeySystemInfo info(kClearKeyKeySystem); |
| @@ -80,6 +93,8 @@ static void AddClearKey(std::vector<KeySystemInfo>* concrete_key_systems) { |
| info.supported_codecs |= EME_CODEC_MP4_ALL; |
| #endif // defined(USE_PROPRIETARY_CODECS) |
| + info.supported_init_data_types = EME_INIT_DATA_TYPE_ALL; |
|
ddorwin
2014/09/13 01:20:46
ditto on moving (also in other files)
sandersd (OOO until July 31)
2014/09/22 23:45:52
Done.
|
| + |
| info.use_aes_decryptor = true; |
| concrete_key_systems->push_back(info); |
| @@ -93,6 +108,12 @@ class KeySystems { |
| bool IsConcreteSupportedKeySystem(const std::string& key_system); |
| + bool IsSupportedKeySystem(const std::string& key_system); |
| + |
| + bool IsSupportedKeySystemWithInitDataType( |
| + const std::string& key_system, |
| + const std::string& init_data_type); |
| + |
| bool IsSupportedKeySystemWithMediaMimeType( |
| const std::string& mime_type, |
| const std::vector<std::string>& codecs, |
| @@ -120,6 +141,7 @@ class KeySystems { |
| const std::string& pepper_type, |
| #endif |
| SupportedCodecs supported_codecs, |
| + SupportedInitDataTypes supported_init_data_types, |
|
ddorwin
2014/09/13 01:20:45
nit: move up one line to match ITS order.
sandersd (OOO until July 31)
2014/09/22 23:45:52
Done.
|
| const std::string& parent_key_system); |
| friend struct base::DefaultLazyInstanceTraits<KeySystems>; |
| @@ -133,12 +155,14 @@ class KeySystems { |
| std::string pepper_type; |
| #endif |
| SupportedCodecs supported_codecs; |
| + SupportedInitDataTypes supported_init_data_types; |
|
ddorwin
2014/09/13 01:20:45
ditto
sandersd (OOO until July 31)
2014/09/22 23:45:52
Done.
|
| }; |
| typedef base::hash_map<std::string, KeySystemProperties> |
| KeySystemPropertiesMap; |
| typedef base::hash_map<std::string, std::string> ParentKeySystemMap; |
| typedef base::hash_map<std::string, EmeCodec> CodecMaskMap; |
| + typedef base::hash_map<std::string, EmeInitDataType> InitDataTypeMaskMap; |
|
ddorwin
2014/09/13 01:20:46
ditto
sandersd (OOO until July 31)
2014/09/22 23:45:53
Done.
|
| KeySystems(); |
| ~KeySystems() {} |
| @@ -167,6 +191,7 @@ class KeySystems { |
| CodecMaskMap container_codec_masks_; |
| CodecMaskMap codec_masks_; |
| + InitDataTypeMaskMap init_data_type_masks_; |
|
ddorwin
2014/09/13 01:20:45
ditto
sandersd (OOO until July 31)
2014/09/22 23:45:53
Done.
|
| bool needs_update_; |
| base::Time last_update_time_; |
| @@ -189,18 +214,15 @@ KeySystems& KeySystems::GetInstance() { |
| // the instance is lazily initiated. |
| KeySystems::KeySystems() : needs_update_(true) { |
| // Build container and codec masks for quick look up. |
| - for (size_t i = 0; i < arraysize(kContainerCodecMasks); ++i) { |
| - const CodecMask& container_codec_mask = kContainerCodecMasks[i]; |
| - DCHECK(container_codec_masks_.find(container_codec_mask.type) == |
| - container_codec_masks_.end()); |
| - container_codec_masks_[container_codec_mask.type] = |
| - container_codec_mask.mask; |
| - } |
| - for (size_t i = 0; i < arraysize(kCodecMasks); ++i) { |
| - const CodecMask& codec_mask = kCodecMasks[i]; |
| - DCHECK(codec_masks_.find(codec_mask.type) == codec_masks_.end()); |
| - codec_masks_[codec_mask.type] = codec_mask.mask; |
| +#define BUILD_MASK(dst, src) \ |
|
ddorwin
2014/09/13 01:20:45
Macros aren't allowed. Would a template function w
sandersd (OOO until July 31)
2014/09/22 23:45:52
I've expanded the macro, but I do think the macro
|
| + for (size_t i = 0; i < arraysize(src); ++i) { \ |
| + DCHECK(dst.find(src[i].type) == dst.end()); \ |
| + dst[src[i].type] = src[i].mask; \ |
| } |
| + BUILD_MASK(container_codec_masks_, kContainerCodecMasks); |
| + BUILD_MASK(codec_masks_, kCodecMasks); |
| + BUILD_MASK(init_data_type_masks_, kInitDataTypeMasks); |
| +#undef BUILD_MASK |
| UpdateSupportedKeySystems(); |
| @@ -264,6 +286,7 @@ void KeySystems::AddConcreteSupportedKeySystems( |
| key_system_info.pepper_type, |
| #endif |
| key_system_info.supported_codecs, |
| + key_system_info.supported_init_data_types, |
| key_system_info.parent_key_system); |
| } |
| } |
| @@ -275,6 +298,7 @@ void KeySystems::AddConcreteSupportedKeySystem( |
| const std::string& pepper_type, |
| #endif |
| SupportedCodecs supported_codecs, |
| + SupportedInitDataTypes supported_init_data_types, |
| const std::string& parent_key_system) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| DCHECK(!IsConcreteSupportedKeySystem(concrete_key_system)) |
| @@ -291,6 +315,7 @@ void KeySystems::AddConcreteSupportedKeySystem( |
| #endif |
| properties.supported_codecs = supported_codecs; |
| + properties.supported_init_data_types = supported_init_data_types; |
| concrete_key_system_map_[concrete_key_system] = properties; |
| @@ -306,8 +331,7 @@ void KeySystems::AddConcreteSupportedKeySystem( |
| bool KeySystems::IsConcreteSupportedKeySystem(const std::string& key_system) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| - return concrete_key_system_map_.find(key_system) != |
| - concrete_key_system_map_.end(); |
| + return concrete_key_system_map_.count(key_system); |
|
ddorwin
2014/09/13 01:20:45
Is there a reason you made this change? Not that i
sandersd (OOO until July 31)
2014/09/22 23:45:53
It's a hash_map.
|
| } |
| bool KeySystems::IsSupportedContainer( |
| @@ -369,6 +393,45 @@ bool KeySystems::IsSupportedContainerAndCodecs( |
| return true; |
| } |
| +bool KeySystems::IsSupportedKeySystem(const std::string& key_system) { |
| + DCHECK(thread_checker_.CalledOnValidThread()); |
| + return (parent_key_system_map_.count(key_system) || |
|
ddorwin
2014/09/13 01:20:45
ditto.
sandersd (OOO until July 31)
2014/09/22 23:45:53
Acknowledged.
|
| + concrete_key_system_map_.count(key_system)); |
|
ddorwin
2014/09/13 01:20:45
minor: We're more likely to see concrete key syste
sandersd (OOO until July 31)
2014/09/22 23:45:53
Done.
|
| +} |
| + |
| +bool KeySystems::IsSupportedKeySystemWithInitDataType( |
| + const std::string& key_system, |
| + const std::string& init_data_type) { |
| + DCHECK(thread_checker_.CalledOnValidThread()); |
| + |
| + // If |key_system| is a parent key system, use its concrete child. |
| + std::string concrete_key_system = key_system; |
| + ParentKeySystemMap::const_iterator parent_key_system_iter = |
| + parent_key_system_map_.find(key_system); |
| + if (parent_key_system_iter != parent_key_system_map_.end()) |
| + concrete_key_system = parent_key_system_iter->second; |
| + |
| + // Locate |concrete_key_system|. |
| + KeySystemPropertiesMap::const_iterator key_system_iter = |
| + concrete_key_system_map_.find(concrete_key_system); |
| + if (key_system_iter == concrete_key_system_map_.end()) |
| + return false; |
| + |
| + // Check |init_data_type|. |
| + InitDataTypeMaskMap::const_iterator init_data_type_iter = |
| + init_data_type_masks_.find(init_data_type); |
| + if (init_data_type_iter == init_data_type_masks_.end()) |
| + return false; |
| + |
| + // Check |key_system| x |init_data_type|. |
| + const KeySystemProperties& properties = key_system_iter->second; |
| + const EmeInitDataType& init_data_type_mask = init_data_type_iter->second; |
| + if (!(properties.supported_init_data_types & init_data_type_mask)) |
| + return false; |
| + |
| + return true; |
| +} |
| + |
| bool KeySystems::IsSupportedKeySystemWithMediaMimeType( |
| const std::string& mime_type, |
| const std::vector<std::string>& codecs, |
| @@ -488,6 +551,17 @@ bool IsConcreteSupportedKeySystem(const std::string& key_system) { |
| return KeySystems::GetInstance().IsConcreteSupportedKeySystem(key_system); |
| } |
| +bool IsSupportedKeySystem(const std::string& key_system) { |
| + return KeySystems::GetInstance().IsSupportedKeySystem(key_system); |
| +} |
| + |
| +bool IsSupportedKeySystemWithInitDataType( |
| + const std::string& key_system, |
| + const std::string& init_data_type) { |
| + return KeySystems::GetInstance().IsSupportedKeySystemWithInitDataType( |
| + key_system, init_data_type); |
| +} |
| + |
| bool IsSupportedKeySystemWithMediaMimeType( |
| const std::string& mime_type, |
| const std::vector<std::string>& codecs, |