diff options
author | ddorwin <ddorwin@chromium.org> | 2015-02-18 16:21:23 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-02-19 00:22:16 +0000 |
commit | fd8af57f621326c5edce78077924135c14eb15dd (patch) | |
tree | 8fdf07c28b1125eb8f2623b7a0fd33d3c6971b71 /media | |
parent | fdad07617cf72b7be8ff5530256fa3aef9b74af5 (diff) | |
download | chromium_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/DEPS | 1 | ||||
-rw-r--r-- | media/base/android/browser_cdm_factory_android.cc | 30 | ||||
-rw-r--r-- | media/base/android/media_drm_bridge.cc | 29 | ||||
-rw-r--r-- | media/base/android/media_drm_bridge.h | 8 | ||||
-rw-r--r-- | media/base/android/media_drm_bridge_unittest.cc | 56 |
5 files changed, 67 insertions, 57 deletions
@@ -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 |