summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content/browser/android/media_player_manager_impl.cc6
-rw-r--r--content/browser/android/media_player_manager_impl.h5
-rw-r--r--media/base/android/media_drm_bridge.cc14
-rw-r--r--media/base/android/media_drm_bridge.h12
-rw-r--r--webkit/renderer/media/crypto/key_systems.cc11
-rw-r--r--webkit/renderer/media/crypto/key_systems.h5
-rw-r--r--webkit/renderer/media/crypto/key_systems_info.cc17
-rw-r--r--webkit/renderer/media/crypto/key_systems_info.h19
-rw-r--r--webkit/renderer/media/crypto/key_systems_unittest.cc18
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