summaryrefslogtreecommitdiffstats
path: root/webkit
diff options
context:
space:
mode:
authorddorwin@chromium.org <ddorwin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-24 06:35:06 +0000
committerddorwin@chromium.org <ddorwin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-24 06:35:06 +0000
commitd21ead47443e8eaa8ee7f33b56981ddade4d15e7 (patch)
treeb7cb40d118d07807fde173a51b7fd8853d083973 /webkit
parente98c20771d6dc0c25ce0470c3ba21f4bbc4bb1df (diff)
downloadchromium_src-d21ead47443e8eaa8ee7f33b56981ddade4d15e7.zip
chromium_src-d21ead47443e8eaa8ee7f33b56981ddade4d15e7.tar.gz
chromium_src-d21ead47443e8eaa8ee7f33b56981ddade4d15e7.tar.bz2
Allow suppressed EME canPlayType() responses to be overridden with flag.
Adds --override-encrypted-media-canplaytype and the corresponding flag. BUG=252967 TBR=jochen@chromium.org Review URL: https://chromiumcodereview.appspot.com/17569003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@208158 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit')
-rw-r--r--webkit/renderer/media/crypto/key_systems.cc5
-rw-r--r--webkit/renderer/media/crypto/key_systems_info.cc33
-rw-r--r--webkit/renderer/media/crypto/key_systems_info.h3
-rw-r--r--webkit/renderer/media/crypto/key_systems_unittest.cc11
4 files changed, 44 insertions, 8 deletions
diff --git a/webkit/renderer/media/crypto/key_systems.cc b/webkit/renderer/media/crypto/key_systems.cc
index 6ece643..2d056b3 100644
--- a/webkit/renderer/media/crypto/key_systems.cc
+++ b/webkit/renderer/media/crypto/key_systems.cc
@@ -112,6 +112,11 @@ bool KeySystems::IsSupportedKeySystemWithMediaMimeType(
const std::string& mime_type,
const std::vector<std::string>& codecs,
const std::string& key_system) {
+ // This method is only used by the canPlaytType() path (not the EME methods),
+ // so we check for suppressed key_systems here.
+ if(IsCanPlayTypeSuppressed(key_system))
+ return false;
+
if (codecs.empty())
return IsSupportedKeySystemWithContainerAndCodec(
mime_type, std::string(), key_system);
diff --git a/webkit/renderer/media/crypto/key_systems_info.cc b/webkit/renderer/media/crypto/key_systems_info.cc
index 9810c34..bb04667 100644
--- a/webkit/renderer/media/crypto/key_systems_info.cc
+++ b/webkit/renderer/media/crypto/key_systems_info.cc
@@ -6,6 +6,8 @@
#include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR.
+// The following must be after widevine_cdm_version.h.
+
#if defined(WIDEVINE_CDM_AVAILABLE) && \
defined(OS_LINUX) && !defined(OS_CHROMEOS)
#include <gnu/libc-version.h>
@@ -13,6 +15,11 @@
#include "base/version.h"
#endif
+#if defined(DISABLE_WIDEVINE_CDM_CANPLAYTYPE)
+#include "base/command_line.h"
+#include "media/base/media_switches.h"
+#endif
+
namespace webkit_media {
static const char kClearKeyKeySystem[] = "webkit-org.w3.clearkey";
@@ -23,7 +30,6 @@ static const char kExternalClearKeyKeySystem[] =
#if defined(WIDEVINE_CDM_AVAILABLE)
// TODO(ddorwin): Automatically support parent systems: http://crbug.com/164303.
static const char kWidevineBaseKeySystem[] = "com.widevine";
-#endif // defined(WIDEVINE_CDM_AVAILABLE)
#if defined(WIDEVINE_CDM_CENC_SUPPORT_AVAILABLE)
// The supported codecs depend on what the CDM provides.
@@ -45,6 +51,12 @@ static const char kWidevineAudioMp4Codecs[] =
#endif
#endif // defined(WIDEVINE_CDM_CENC_SUPPORT_AVAILABLE)
+static inline bool IsWidevine(const std::string& key_system) {
+ return key_system == kWidevineKeySystem ||
+ key_system == kWidevineBaseKeySystem;
+}
+#endif // defined(WIDEVINE_CDM_AVAILABLE)
+
const MediaFormatAndKeySystem kSupportedFormatKeySystemCombinations[] = {
// Clear Key.
{ "video/webm", "vorbis,vp8,vp8.0", kClearKeyKeySystem },
@@ -64,10 +76,6 @@ const MediaFormatAndKeySystem kSupportedFormatKeySystemCombinations[] = {
#if defined(WIDEVINE_CDM_AVAILABLE)
// Widevine.
- // See http://crbug.com/237627.
-#if defined(DISABLE_WIDEVINE_CDM_CANPLAYTYPE)
- { "", "", kWidevineKeySystem },
-#else
{ "video/webm", "vorbis,vp8,vp8.0", kWidevineKeySystem },
{ "audio/webm", "vorbis", kWidevineKeySystem },
{ "video/webm", "vorbis,vp8,vp8.0", kWidevineBaseKeySystem },
@@ -80,7 +88,6 @@ const MediaFormatAndKeySystem kSupportedFormatKeySystemCombinations[] = {
{ "audio/mp4", kWidevineAudioMp4Codecs, kWidevineBaseKeySystem },
#endif // defined(WIDEVINE_CDM_CENC_SUPPORT_AVAILABLE)
#endif // defined(GOOGLE_CHROME_BUILD) || defined(USE_PROPRIETARY_CODECS)
-#endif // defined(DISABLE_WIDEVINE_CDM_CANPLAYTYPE)
#endif // WIDEVINE_CDM_AVAILABLE
};
@@ -117,8 +124,7 @@ const int kNumKeySystemToUUIDMapping =
bool IsSystemCompatible(const std::string& key_system) {
#if defined(WIDEVINE_CDM_AVAILABLE) && \
defined(OS_LINUX) && !defined(OS_CHROMEOS)
- if (key_system == kWidevineKeySystem ||
- key_system == kWidevineBaseKeySystem) {
+ if (IsWidevine(key_system)) {
Version glibc_version(gnu_get_libc_version());
DCHECK(glibc_version.IsValid());
return !glibc_version.IsOlderThan(WIDEVINE_CDM_MIN_GLIBC_VERSION);
@@ -127,6 +133,17 @@ bool IsSystemCompatible(const std::string& key_system) {
return true;
}
+bool IsCanPlayTypeSuppressed(const std::string& key_system) {
+#if defined(DISABLE_WIDEVINE_CDM_CANPLAYTYPE)
+ // See http://crbug.com/237627.
+ if (IsWidevine(key_system) &&
+ !CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kOverrideEncryptedMediaCanPlayType))
+ return true;
+#endif
+ return false;
+}
+
std::string KeySystemNameForUMAGeneric(const std::string& key_system) {
if (key_system == kClearKeyKeySystem)
return "ClearKey";
diff --git a/webkit/renderer/media/crypto/key_systems_info.h b/webkit/renderer/media/crypto/key_systems_info.h
index e80e0f6..0c499db 100644
--- a/webkit/renderer/media/crypto/key_systems_info.h
+++ b/webkit/renderer/media/crypto/key_systems_info.h
@@ -55,6 +55,9 @@ extern const int kNumKeySystemToUUIDMapping;
// Returns whether |key_system| is compatible with the user's system.
bool IsSystemCompatible(const std::string& key_system);
+// Returns true if canPlayType should return an empty string for |key_system|.
+bool IsCanPlayTypeSuppressed(const std::string& key_system);
+
// Returns the name that UMA will use for the given |key_system|.
// This function can be called frequently. Hence this function should be
// implemented not to impact performance.
diff --git a/webkit/renderer/media/crypto/key_systems_unittest.cc b/webkit/renderer/media/crypto/key_systems_unittest.cc
index b8cb1d7..98cc950 100644
--- a/webkit/renderer/media/crypto/key_systems_unittest.cc
+++ b/webkit/renderer/media/crypto/key_systems_unittest.cc
@@ -540,7 +540,13 @@ TEST_F(KeySystemsTest,
//
TEST_F(KeySystemsTest, Widevine_Basic) {
+#if defined(WIDEVINE_CDM_AVAILABLE) && \
+ defined(DISABLE_WIDEVINE_CDM_CANPLAYTYPE)
+ EXPECT_TRUE(IsSupportedKeySystem(WebString::fromUTF8(kWidevineAlpha)));
+#else
EXPECT_WV(IsSupportedKeySystem(WebString::fromUTF8(kWidevineAlpha)));
+#endif
+
EXPECT_WV(IsSupportedKeySystemWithMediaMimeType(
"video/webm", no_codecs(), kWidevineAlpha));
@@ -571,7 +577,12 @@ TEST_F(KeySystemsTest, Widevine_Basic) {
TEST_F(KeySystemsTest, Widevine_Parent) {
const char* const kWidevineParent = kWidevine;
+#if defined(WIDEVINE_CDM_AVAILABLE) && \
+ defined(DISABLE_WIDEVINE_CDM_CANPLAYTYPE)
+ EXPECT_TRUE(IsSupportedKeySystem(WebString::fromUTF8(kWidevineParent)));
+#else
EXPECT_WV(IsSupportedKeySystem(WebString::fromUTF8(kWidevineParent)));
+#endif
EXPECT_WV(IsSupportedKeySystemWithMediaMimeType(
"video/webm", no_codecs(), kWidevineParent));