summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorddorwin <ddorwin@chromium.org>2015-02-18 16:21:23 -0800
committerCommit bot <commit-bot@chromium.org>2015-02-19 00:22:16 +0000
commitfd8af57f621326c5edce78077924135c14eb15dd (patch)
tree8fdf07c28b1125eb8f2623b7a0fd33d3c6971b71 /media
parentfdad07617cf72b7be8ff5530256fa3aef9b74af5 (diff)
downloadchromium_src-fd8af57f621326c5edce78077924135c14eb15dd.zip
chromium_src-fd8af57f621326c5edce78077924135c14eb15dd.tar.gz
chromium_src-fd8af57f621326c5edce78077924135c14eb15dd.tar.bz2
MediaDrm: Only apply Widevine security levels to the Widevine key system.
BUG=459400 Review URL: https://codereview.chromium.org/930413003 Cr-Commit-Position: refs/heads/master@{#316930}
Diffstat (limited to 'media')
-rw-r--r--media/DEPS1
-rw-r--r--media/base/android/browser_cdm_factory_android.cc30
-rw-r--r--media/base/android/media_drm_bridge.cc29
-rw-r--r--media/base/android/media_drm_bridge.h8
-rw-r--r--media/base/android/media_drm_bridge_unittest.cc56
5 files changed, 67 insertions, 57 deletions
diff --git a/media/DEPS b/media/DEPS
index 57eecbb..cad0352 100644
--- a/media/DEPS
+++ b/media/DEPS
@@ -12,5 +12,6 @@ include_rules = [
"+ui/gfx",
"+ui/gl",
"+ui/ozone",
+ "+third_party/widevine/cdm/widevine_cdm_common.h",
"-media/blink",
]
diff --git a/media/base/android/browser_cdm_factory_android.cc b/media/base/android/browser_cdm_factory_android.cc
index 5c7f365..e116863 100644
--- a/media/base/android/browser_cdm_factory_android.cc
+++ b/media/base/android/browser_cdm_factory_android.cc
@@ -9,6 +9,7 @@
#include "base/memory/scoped_ptr.h"
#include "media/base/android/media_drm_bridge.h"
#include "media/base/media_switches.h"
+#include "third_party/widevine/cdm/widevine_cdm_common.h"
namespace media {
@@ -33,15 +34,26 @@ scoped_ptr<BrowserCdm> BrowserCdmFactoryAndroid::CreateBrowserCdm(
}
// TODO(xhwang/ddorwin): Pass the security level from key system.
- MediaDrmBridge::SecurityLevel security_level =
- MediaDrmBridge::SECURITY_LEVEL_3;
- if (base::CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kMediaDrmEnableNonCompositing)) {
- security_level = MediaDrmBridge::SECURITY_LEVEL_1;
- }
- if (!cdm->SetSecurityLevel(security_level)) {
- DVLOG(1) << "failed to set security level " << security_level;
- return scoped_ptr<BrowserCdm>();
+ // http://crbug.com/459400
+ if (key_system == kWidevineKeySystem) {
+ MediaDrmBridge::SecurityLevel security_level =
+ MediaDrmBridge::SECURITY_LEVEL_3;
+ if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kMediaDrmEnableNonCompositing)) {
+ security_level = MediaDrmBridge::SECURITY_LEVEL_1;
+ }
+ if (!cdm->SetSecurityLevel(security_level)) {
+ DVLOG(1) << "failed to set security level " << security_level;
+ return scoped_ptr<BrowserCdm>();
+ }
+ } else {
+ // Assume other key systems do not support full compositing.
+ if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kMediaDrmEnableNonCompositing)) {
+ NOTREACHED() << key_system << " may require "
+ << switches::kMediaDrmEnableNonCompositing;
+ return scoped_ptr<BrowserCdm>();
+ }
}
return cdm.Pass();
diff --git a/media/base/android/media_drm_bridge.cc b/media/base/android/media_drm_bridge.cc
index a89522d..ecac704 100644
--- a/media/base/android/media_drm_bridge.cc
+++ b/media/base/android/media_drm_bridge.cc
@@ -298,6 +298,7 @@ bool MediaDrmBridge::IsAvailable() {
return true;
}
+// TODO(ddorwin): This is specific to Widevine. http://crbug.com/459400
// static
bool MediaDrmBridge::IsSecureDecoderRequired(SecurityLevel security_level) {
DCHECK(IsAvailable());
@@ -305,20 +306,6 @@ bool MediaDrmBridge::IsSecureDecoderRequired(SecurityLevel security_level) {
}
// static
-bool MediaDrmBridge::IsSecurityLevelSupported(const std::string& key_system,
- SecurityLevel security_level) {
- if (!IsAvailable())
- return false;
-
- scoped_ptr<MediaDrmBridge> media_drm_bridge =
- MediaDrmBridge::CreateWithoutSessionSupport(key_system);
- if (!media_drm_bridge)
- return false;
-
- return media_drm_bridge->SetSecurityLevel(security_level);
-}
-
-// static
std::vector<std::string> MediaDrmBridge::GetPlatformKeySystemNames() {
return g_key_system_uuid_manager.Get().GetPlatformKeySystemNames();
}
@@ -404,6 +391,13 @@ scoped_ptr<MediaDrmBridge> MediaDrmBridge::CreateWithoutSessionSupport(
}
bool MediaDrmBridge::SetSecurityLevel(SecurityLevel security_level) {
+ if (security_level != SECURITY_LEVEL_NONE &&
+ !std::equal(scheme_uuid_.begin(), scheme_uuid_.end(), kWidevineUuid)) {
+ NOTREACHED() << "Widevine security level " << security_level
+ << "used with another key system";
+ return false;
+ }
+
JNIEnv* env = AttachCurrentThread();
std::string security_level_str = GetSecurityLevelString(security_level);
@@ -636,7 +630,12 @@ MediaDrmBridge::SecurityLevel MediaDrmBridge::GetSecurityLevel() {
}
bool MediaDrmBridge::IsProtectedSurfaceRequired() {
- return IsSecureDecoderRequired(GetSecurityLevel());
+ // For Widevine, this depends on the security level.
+ if (std::equal(scheme_uuid_.begin(), scheme_uuid_.end(), kWidevineUuid))
+ return IsSecureDecoderRequired(GetSecurityLevel());
+
+ // For other key systems, assume true.
+ return true;
}
void MediaDrmBridge::ResetDeviceCredentials(
diff --git a/media/base/android/media_drm_bridge.h b/media/base/android/media_drm_bridge.h
index e774470..06716df 100644
--- a/media/base/android/media_drm_bridge.h
+++ b/media/base/android/media_drm_bridge.h
@@ -27,6 +27,7 @@ class MediaPlayerManager;
// This class provides DRM services for android EME implementation.
class MEDIA_EXPORT MediaDrmBridge : public BrowserCdm {
public:
+ // TODO(ddorwin): These are specific to Widevine. http://crbug.com/459400
enum SecurityLevel {
SECURITY_LEVEL_NONE = 0,
SECURITY_LEVEL_1 = 1,
@@ -42,9 +43,6 @@ class MEDIA_EXPORT MediaDrmBridge : public BrowserCdm {
// to check IsAvailable() explicitly before calling them.
static bool IsAvailable();
- static bool IsSecurityLevelSupported(const std::string& key_system,
- SecurityLevel security_level);
-
// Checks whether |key_system| is supported.
static bool IsKeySystemSupported(const std::string& key_system);
@@ -58,8 +56,6 @@ class MEDIA_EXPORT MediaDrmBridge : public BrowserCdm {
const std::string& key_system,
const std::string& container_mime_type);
- static bool IsSecureDecoderRequired(SecurityLevel security_level);
-
static bool RegisterMediaDrmBridge(JNIEnv* env);
// Returns a MediaDrmBridge instance if |key_system| is supported, or a NULL
@@ -191,6 +187,8 @@ class MEDIA_EXPORT MediaDrmBridge : public BrowserCdm {
const SessionErrorCB& session_error_cb,
const SessionKeysChangeCB& session_keys_change_cb);
+ static bool IsSecureDecoderRequired(SecurityLevel security_level);
+
// Get the security level of the media.
SecurityLevel GetSecurityLevel();
diff --git a/media/base/android/media_drm_bridge_unittest.cc b/media/base/android/media_drm_bridge_unittest.cc
index 1a4c014..1855c2c 100644
--- a/media/base/android/media_drm_bridge_unittest.cc
+++ b/media/base/android/media_drm_bridge_unittest.cc
@@ -34,10 +34,6 @@ const MediaDrmBridge::SecurityLevel kL3 = MediaDrmBridge::SECURITY_LEVEL_3;
// Helper functions to avoid typing "MediaDrmBridge::" in tests.
-static bool IsKeySystemSupported(const std::string& key_system) {
- return MediaDrmBridge::IsKeySystemSupported(key_system);
-}
-
static bool IsKeySystemSupportedWithType(
const std::string& key_system,
const std::string& container_mime_type) {
@@ -45,29 +41,9 @@ static bool IsKeySystemSupportedWithType(
container_mime_type);
}
-static bool IsSecurityLevelSupported(
- const std::string& key_system,
- MediaDrmBridge::SecurityLevel security_level) {
- return MediaDrmBridge::IsSecurityLevelSupported(key_system, security_level);
-}
-
-TEST(MediaDrmBridgeTest, IsSecurityLevelSupported_Widevine) {
- EXPECT_FALSE(IsSecurityLevelSupported(kWidevineKeySystem, kLNone));
- // We test "L3" fully. But for "L1" we don't check the result as it depends on
- // whether the test device supports "L1".
- EXPECT_TRUE_IF_AVAILABLE(IsSecurityLevelSupported(kWidevineKeySystem, kL3));
- IsSecurityLevelSupported(kWidevineKeySystem, kL1);
-}
-
-// Invalid keysytem is NOT supported regardless whether MediaDrm is available.
-TEST(MediaDrmBridgeTest, IsSecurityLevelSupported_InvalidKeySystem) {
- EXPECT_FALSE(IsSecurityLevelSupported(kInvalidKeySystem, kLNone));
- EXPECT_FALSE(IsSecurityLevelSupported(kInvalidKeySystem, kL1));
- EXPECT_FALSE(IsSecurityLevelSupported(kInvalidKeySystem, kL3));
-}
-
TEST(MediaDrmBridgeTest, IsKeySystemSupported_Widevine) {
- EXPECT_TRUE_IF_AVAILABLE(IsKeySystemSupported(kWidevineKeySystem));
+ EXPECT_TRUE_IF_AVAILABLE(
+ MediaDrmBridge::IsKeySystemSupported(kWidevineKeySystem));
// TODO(xhwang): Enable when b/13564917 is fixed.
// EXPECT_TRUE_IF_AVAILABLE(
@@ -88,9 +64,9 @@ TEST(MediaDrmBridgeTest, IsKeySystemSupported_Widevine) {
EXPECT_FALSE(IsKeySystemSupportedWithType(kWidevineKeySystem, "audio/mp3"));
}
-// Invalid keysytem is NOT supported regardless whether MediaDrm is available.
+// Invalid key system is NOT supported regardless whether MediaDrm is available.
TEST(MediaDrmBridgeTest, IsKeySystemSupported_InvalidKeySystem) {
- EXPECT_FALSE(IsKeySystemSupported(kInvalidKeySystem));
+ EXPECT_FALSE(MediaDrmBridge::IsKeySystemSupported(kInvalidKeySystem));
EXPECT_FALSE(IsKeySystemSupportedWithType(kInvalidKeySystem, kAudioMp4));
EXPECT_FALSE(IsKeySystemSupportedWithType(kInvalidKeySystem, kVideoMp4));
EXPECT_FALSE(IsKeySystemSupportedWithType(kInvalidKeySystem, kAudioWebM));
@@ -100,4 +76,28 @@ TEST(MediaDrmBridgeTest, IsKeySystemSupported_InvalidKeySystem) {
EXPECT_FALSE(IsKeySystemSupportedWithType(kInvalidKeySystem, "audio/mp3"));
}
+TEST(MediaDrmBridgeTest, CreateWithoutSessionSupport_Widevine) {
+ EXPECT_TRUE_IF_AVAILABLE(
+ MediaDrmBridge::CreateWithoutSessionSupport(kWidevineKeySystem));
+}
+
+// Invalid key system is NOT supported regardless whether MediaDrm is available.
+TEST(MediaDrmBridgeTest, CreateWithoutSessionSupport_InvalidKeySystem) {
+ EXPECT_FALSE(MediaDrmBridge::CreateWithoutSessionSupport(kInvalidKeySystem));
+}
+
+TEST(MediaDrmBridgeTest, SetSecurityLevel_Widevine) {
+ scoped_ptr<MediaDrmBridge> media_drm_bridge =
+ MediaDrmBridge::CreateWithoutSessionSupport(kWidevineKeySystem);
+ EXPECT_TRUE_IF_AVAILABLE(media_drm_bridge);
+ if (!media_drm_bridge)
+ return;
+
+ EXPECT_FALSE(media_drm_bridge->SetSecurityLevel(kLNone));
+ // We test "L3" fully. But for "L1" we don't check the result as it depends on
+ // whether the test device supports "L1".
+ EXPECT_TRUE(media_drm_bridge->SetSecurityLevel(kL3));
+ media_drm_bridge->SetSecurityLevel(kL1);
+}
+
} // namespace media