diff options
-rw-r--r-- | content/browser/android/media_player_manager_impl.cc | 6 | ||||
-rw-r--r-- | content/browser/android/media_player_manager_impl.h | 5 | ||||
-rw-r--r-- | media/base/android/media_drm_bridge.cc | 14 | ||||
-rw-r--r-- | media/base/android/media_drm_bridge.h | 12 | ||||
-rw-r--r-- | webkit/renderer/media/crypto/key_systems.cc | 11 | ||||
-rw-r--r-- | webkit/renderer/media/crypto/key_systems.h | 5 | ||||
-rw-r--r-- | webkit/renderer/media/crypto/key_systems_info.cc | 17 | ||||
-rw-r--r-- | webkit/renderer/media/crypto/key_systems_info.h | 19 | ||||
-rw-r--r-- | webkit/renderer/media/crypto/key_systems_unittest.cc | 18 |
9 files changed, 99 insertions, 8 deletions
diff --git a/content/browser/android/media_player_manager_impl.cc b/content/browser/android/media_player_manager_impl.cc index 73b1188..dbcdc71 100644 --- a/content/browser/android/media_player_manager_impl.cc +++ b/content/browser/android/media_player_manager_impl.cc @@ -492,6 +492,12 @@ void MediaPlayerManagerImpl::RemovePlayer(int player_id) { } } +void MediaPlayerManagerImpl::AddDrmBridge(int media_keys_id, + const std::vector<uint8>& uuid) { + DCHECK(!GetDrmBridge(media_keys_id)); + drm_bridges_.push_back(MediaDrmBridge::Create(media_keys_id, uuid)); +} + void MediaPlayerManagerImpl::RemoveDrmBridge(int media_keys_id) { for (ScopedVector<MediaDrmBridge>::iterator it = drm_bridges_.begin(); it != drm_bridges_.end(); ++it) { diff --git a/content/browser/android/media_player_manager_impl.h b/content/browser/android/media_player_manager_impl.h index d59b32b..8fa3039 100644 --- a/content/browser/android/media_player_manager_impl.h +++ b/content/browser/android/media_player_manager_impl.h @@ -145,8 +145,11 @@ class CONTENT_EXPORT MediaPlayerManagerImpl // Removes the player with the specified id. void RemovePlayer(int player_id); + // Add a new DrmBridge for the given |uuid| and |media_keys_id|. + void AddDrmBridge(int media_keys_id, const std::vector<uint8>& uuid); + // Removes the DRM bridge with the specified id. - void RemoveDrmBridge(int key_id); + void RemoveDrmBridge(int media_keys_id); private: // An array of managed players. diff --git a/media/base/android/media_drm_bridge.cc b/media/base/android/media_drm_bridge.cc index 8760900..5cdd26c 100644 --- a/media/base/android/media_drm_bridge.cc +++ b/media/base/android/media_drm_bridge.cc @@ -15,9 +15,21 @@ bool MediaDrmBridge::IsAvailable() { return false; } +MediaDrmBridge* MediaDrmBridge::Create(int media_keys_id, + const std::vector<uint8>& uuid) { + if (!IsAvailable()) + return NULL; + + // TODO(qinmin): check whether the uuid is valid. + return new MediaDrmBridge(media_keys_id, uuid); +} + MediaDrmBridge::MediaDrmBridge( int media_keys_id, const std::vector<uint8>& uuid) - : media_keys_id_(media_keys_id) {} + : media_keys_id_(media_keys_id), + uuid_(uuid) { + // TODO(qinmin): pass the uuid to DRM engine. +} MediaDrmBridge::~MediaDrmBridge() {} diff --git a/media/base/android/media_drm_bridge.h b/media/base/android/media_drm_bridge.h index 60ecfa1..90f6d13 100644 --- a/media/base/android/media_drm_bridge.h +++ b/media/base/android/media_drm_bridge.h @@ -19,10 +19,13 @@ namespace media { // TODO(qinmin): implement all the functions in this class. class MEDIA_EXPORT MediaDrmBridge : public MediaKeys { public: - // TODO(xhwang): Pass in |key_system|. - MediaDrmBridge(int media_keys_id, const std::vector<uint8>& uuid); virtual ~MediaDrmBridge(); + // Returns a MediaDrmBridge instance if |uuid| is supported, or a NULL + // pointer otherwise. + static MediaDrmBridge* Create(int media_keys_id, + const std::vector<uint8>& uuid); + // Checks whether DRM is available. static bool IsAvailable(); @@ -51,9 +54,14 @@ class MEDIA_EXPORT MediaDrmBridge : public MediaKeys { int media_keys_id() const { return media_keys_id_; } private: + MediaDrmBridge(int media_keys_id, const std::vector<uint8>& uuid); + // Id of the MediaKeys object. int media_keys_id_; + // UUID of the key system. + std::vector<uint8> uuid_; + DISALLOW_COPY_AND_ASSIGN(MediaDrmBridge); }; diff --git a/webkit/renderer/media/crypto/key_systems.cc b/webkit/renderer/media/crypto/key_systems.cc index 161ec88..6ece643 100644 --- a/webkit/renderer/media/crypto/key_systems.cc +++ b/webkit/renderer/media/crypto/key_systems.cc @@ -160,4 +160,15 @@ std::string GetPepperType(const std::string& key_system) { } #endif // defined(ENABLE_PEPPER_CDMS) +#if defined(OS_ANDROID) +std::vector<uint8> GetUUID(const std::string& key_system) { + for (int i = 0; i < kNumKeySystemToUUIDMapping; ++i) { + if (kKeySystemToUUIDMapping[i].key_system == key_system) + return std::vector<uint8>(kKeySystemToUUIDMapping[i].uuid, + kKeySystemToUUIDMapping[i].uuid + 16); + } + return std::vector<uint8>(); +} +#endif // defined(OS_ANDROID) + } // namespace webkit_media diff --git a/webkit/renderer/media/crypto/key_systems.h b/webkit/renderer/media/crypto/key_systems.h index 1332bad..a2e439f 100644 --- a/webkit/renderer/media/crypto/key_systems.h +++ b/webkit/renderer/media/crypto/key_systems.h @@ -40,6 +40,11 @@ bool CanUseAesDecryptor(const std::string& key_system); std::string GetPepperType(const std::string& key_system); #endif +#if defined(OS_ANDROID) +// Convert |key_system| to 16-byte Android UUID. +std::vector<uint8> GetUUID(const std::string& key_system); +#endif + } // namespace webkit_media #endif // WEBKIT_RENDERER_MEDIA_CRYPTO_KEY_SYSTEMS_H_ diff --git a/webkit/renderer/media/crypto/key_systems_info.cc b/webkit/renderer/media/crypto/key_systems_info.cc index 010ed23..9810c34 100644 --- a/webkit/renderer/media/crypto/key_systems_info.cc +++ b/webkit/renderer/media/crypto/key_systems_info.cc @@ -4,8 +4,6 @@ #include "webkit/renderer/media/crypto/key_systems_info.h" -#include "base/basictypes.h" - #include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR. #if defined(WIDEVINE_CDM_AVAILABLE) && \ @@ -101,6 +99,21 @@ const int kNumKeySystemToPepperTypeMapping = arraysize(kKeySystemToPepperTypeMapping); #endif // defined(ENABLE_PEPPER_CDMS) +#if defined(OS_ANDROID) +// TODO(qinmin): add UUIDs for other key systems. +const KeySystemUUIDPair kKeySystemToUUIDMapping[] = { +#if defined(WIDEVINE_CDM_AVAILABLE) + { kWidevineKeySystem, { 0xED, 0xEF, 0x8B, 0xA9, 0x79, 0xD6, 0x4A, 0xCE, + 0xA3, 0xC8, 0x27, 0xDC, 0xD5, 0x1D, 0x21, 0xED } + } +#endif // defined(WIDEVINE_CDM_AVAILABLE) +}; + +// arraySize() does not work if the array is empty, so use ARRAYSIZE_UNSAFE(). +const int kNumKeySystemToUUIDMapping = + ARRAYSIZE_UNSAFE(kKeySystemToUUIDMapping); +#endif // defined(OS_ANDROID) + bool IsSystemCompatible(const std::string& key_system) { #if defined(WIDEVINE_CDM_AVAILABLE) && \ defined(OS_LINUX) && !defined(OS_CHROMEOS) diff --git a/webkit/renderer/media/crypto/key_systems_info.h b/webkit/renderer/media/crypto/key_systems_info.h index 924be72..e80e0f6 100644 --- a/webkit/renderer/media/crypto/key_systems_info.h +++ b/webkit/renderer/media/crypto/key_systems_info.h @@ -7,6 +7,8 @@ #include <string> +#include "base/basictypes.h" + namespace webkit_media { struct MediaFormatAndKeySystem { @@ -20,7 +22,14 @@ struct KeySystemPepperTypePair { const char* key_system; const char* type; }; -#endif +#endif // defined(ENABLE_PEPPER_CDMS) + +#if defined(OS_ANDROID) +struct KeySystemUUIDPair { + const char* key_system; + const uint8 uuid[16]; +}; +#endif // defined(OS_ANDROID) // Specifies the container and codec combinations supported by individual // key systems. Each line is a container-codecs combination and the key system @@ -35,7 +44,13 @@ extern const int kNumSupportedFormatKeySystemCombinations; // There should be one entry for each key system. extern const KeySystemPepperTypePair kKeySystemToPepperTypeMapping[]; extern const int kNumKeySystemToPepperTypeMapping; -#endif +#endif // defined(ENABLE_PEPPER_CDMS) + +#if defined(OS_ANDROID) +// Mapping from key system to UUID, one entry per key system. +extern const KeySystemUUIDPair kKeySystemToUUIDMapping[]; +extern const int kNumKeySystemToUUIDMapping; +#endif // defined(OS_ANDROID) // Returns whether |key_system| is compatible with the user's system. bool IsSystemCompatible(const std::string& key_system); diff --git a/webkit/renderer/media/crypto/key_systems_unittest.cc b/webkit/renderer/media/crypto/key_systems_unittest.cc index efd318d..b8cb1d7 100644 --- a/webkit/renderer/media/crypto/key_systems_unittest.cc +++ b/webkit/renderer/media/crypto/key_systems_unittest.cc @@ -753,4 +753,22 @@ TEST_F(KeySystemsTest, IsSupportedKeySystemWithMediaMimeType_Widevine_MP4) { "audio/mp4", vorbis_codec(), kWidevineAlpha)); } +#if defined(OS_ANDROID) +TEST_F(KeySystemsTest, GetUUID_Widevine) { + std::vector<uint8> uuid = GetUUID(kWidevineAlpha); +#if defined(WIDEVINE_CDM_AVAILABLE) + EXPECT_EQ(16u, uuid.size()); + EXPECT_EQ(0xED, uuid[15]); +#else + EXPECT_TRUE(uuid.empty()); +#endif +} + +TEST_F(KeySystemsTest, GetUUID_Unrecognized) { + EXPECT_TRUE(GetUUID(kWidevine).empty()); + EXPECT_TRUE(GetUUID(kClearKey).empty()); + EXPECT_TRUE(GetUUID("").empty()); +} +#endif // defined(OS_ANDROID) + } // namespace webkit_media |