diff options
-rw-r--r-- | chrome/browser/media/encrypted_media_browsertest.cc | 12 | ||||
-rw-r--r-- | chrome/browser/media/encrypted_media_istypesupported_browsertest.cc | 68 | ||||
-rw-r--r-- | chrome/renderer/media/chrome_key_systems.cc | 10 | ||||
-rw-r--r-- | components/cdm/browser/cdm_message_filter_android.cc | 1 | ||||
-rw-r--r-- | content/browser/media/encrypted_media_browsertest.cc | 24 | ||||
-rw-r--r-- | media/base/eme_constants.h | 13 | ||||
-rw-r--r-- | media/base/key_systems.cc | 5 |
7 files changed, 125 insertions, 8 deletions
diff --git a/chrome/browser/media/encrypted_media_browsertest.cc b/chrome/browser/media/encrypted_media_browsertest.cc index ae27e70..e119636 100644 --- a/chrome/browser/media/encrypted_media_browsertest.cc +++ b/chrome/browser/media/encrypted_media_browsertest.cc @@ -555,6 +555,18 @@ IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_VP9Video_WebM) { TestSimplePlayback("bear-320x240-v-vp9_enc-v.webm", kWebMVP9VideoOnly); } +IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_AudioOnly_WebM_Opus) { + TestSimplePlayback("bear-320x240-opus-a_enc-a.webm", kWebMAudioOnly); +} + +IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_VideoAudio_WebM_Opus) { + TestSimplePlayback("bear-320x240-opus-av_enc-av.webm", kWebMAudioVideo); +} + +IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_VideoClearAudio_WebM_Opus) { + TestSimplePlayback("bear-320x240-opus-av_enc-v.webm", kWebMAudioVideo); +} + IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, InvalidResponseKeyError) { RunInvalidResponseTest(); } diff --git a/chrome/browser/media/encrypted_media_istypesupported_browsertest.cc b/chrome/browser/media/encrypted_media_istypesupported_browsertest.cc index d725ad1..7d13c04 100644 --- a/chrome/browser/media/encrypted_media_istypesupported_browsertest.cc +++ b/chrome/browser/media/encrypted_media_istypesupported_browsertest.cc @@ -106,8 +106,16 @@ class EncryptedMediaIsTypeSupportedTest : public InProcessBrowserTest { vp90_codec_.push_back("vp9.0"); + opus_codec_.push_back("opus"); + vorbis_codec_.push_back("vorbis"); + vp8_and_opus_codecs_.push_back("vp8"); + vp8_and_opus_codecs_.push_back("opus"); + + vp9_and_opus_codecs_.push_back("vp9"); + vp9_and_opus_codecs_.push_back("opus"); + vp8_and_vorbis_codecs_.push_back("vp8"); vp8_and_vorbis_codecs_.push_back("vorbis"); @@ -157,7 +165,14 @@ class EncryptedMediaIsTypeSupportedTest : public InProcessBrowserTest { const CodecVector& vp80_codec() const { return vp80_codec_; } const CodecVector& vp9_codec() const { return vp9_codec_; } const CodecVector& vp90_codec() const { return vp90_codec_; } + const CodecVector& opus_codec() const { return opus_codec_; } const CodecVector& vorbis_codec() const { return vorbis_codec_; } + const CodecVector& vp8_and_opus_codecs() const { + return vp8_and_opus_codecs_; + } + const CodecVector& vp9_and_opus_codecs() const { + return vp9_and_opus_codecs_; + } const CodecVector& vp8_and_vorbis_codecs() const { return vp8_and_vorbis_codecs_; } @@ -298,7 +313,10 @@ class EncryptedMediaIsTypeSupportedTest : public InProcessBrowserTest { CodecVector vp80_codec_; CodecVector vp9_codec_; CodecVector vp90_codec_; + CodecVector opus_codec_; CodecVector vorbis_codec_; + CodecVector vp8_and_opus_codecs_; + CodecVector vp9_and_opus_codecs_; CodecVector vp8_and_vorbis_codecs_; CodecVector vp9_and_vorbis_codecs_; CodecVector avc1_codec_; @@ -481,12 +499,18 @@ IN_PROC_BROWSER_TEST_F(EncryptedMediaIsTypeSupportedTest, EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( "video/webm", vp80_codec(), kPrefixedClearKey)); EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( + "video/webm", vp8_and_opus_codecs(), kPrefixedClearKey)); + EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( "video/webm", vp8_and_vorbis_codecs(), kPrefixedClearKey)); EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( "video/webm", vp9_codec(), kPrefixedClearKey)); EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( "video/webm", vp90_codec(), kPrefixedClearKey)); EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( + "video/webm", vp9_and_opus_codecs(), kPrefixedClearKey)); + EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( + "video/webm", opus_codec(), kPrefixedClearKey)); + EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( "video/webm", vp9_and_vorbis_codecs(), kPrefixedClearKey)); EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( "video/webm", vorbis_codec(), kPrefixedClearKey)); @@ -507,16 +531,22 @@ IN_PROC_BROWSER_TEST_F(EncryptedMediaIsTypeSupportedTest, EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( "audio/webm", no_codecs(), kPrefixedClearKey)); EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( + "audio/webm", opus_codec(), kPrefixedClearKey)); + EXPECT_TRUE(IsSupportedKeySystemWithMediaMimeType( "audio/webm", vorbis_codec(), kPrefixedClearKey)); // Non-audio codecs. EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( "audio/webm", vp8_codec(), kPrefixedClearKey)); EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( + "audio/webm", vp8_and_opus_codecs(), kPrefixedClearKey)); + EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( "audio/webm", vp8_and_vorbis_codecs(), kPrefixedClearKey)); EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( "audio/webm", vp9_codec(), kPrefixedClearKey)); EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( + "audio/webm", vp9_and_opus_codecs(), kPrefixedClearKey)); + EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( "audio/webm", vp9_and_vorbis_codecs(), kPrefixedClearKey)); // Non-Webm codec. @@ -597,6 +627,8 @@ IN_PROC_BROWSER_TEST_F(EncryptedMediaIsTypeSupportedTest, // Invalid or Non-MP4 codec. EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( + "audio/mp4", opus_codec(), kPrefixedClearKey)); + EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( "audio/mp4", vorbis_codec(), kPrefixedClearKey)); EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( "audio/mp4", mp4a_invalid_no_extension(), kPrefixedClearKey)); @@ -692,12 +724,18 @@ IN_PROC_BROWSER_TEST_F( EXPECT_ECK(IsSupportedKeySystemWithMediaMimeType( "video/webm", vp80_codec(), kExternalClearKey)); EXPECT_ECK(IsSupportedKeySystemWithMediaMimeType( + "video/webm", vp8_and_opus_codecs(), kExternalClearKey)); + EXPECT_ECK(IsSupportedKeySystemWithMediaMimeType( "video/webm", vp8_and_vorbis_codecs(), kExternalClearKey)); EXPECT_ECK(IsSupportedKeySystemWithMediaMimeType( "video/webm", vp9_codec(), kExternalClearKey)); EXPECT_ECK(IsSupportedKeySystemWithMediaMimeType( "video/webm", vp90_codec(), kExternalClearKey)); EXPECT_ECK(IsSupportedKeySystemWithMediaMimeType( + "video/webm", vp9_and_opus_codecs(), kExternalClearKey)); + EXPECT_ECK(IsSupportedKeySystemWithMediaMimeType( + "video/webm", opus_codec(), kExternalClearKey)); + EXPECT_ECK(IsSupportedKeySystemWithMediaMimeType( "video/webm", vp9_and_vorbis_codecs(), kExternalClearKey)); EXPECT_ECK(IsSupportedKeySystemWithMediaMimeType( "video/webm", vorbis_codec(), kExternalClearKey)); @@ -718,16 +756,22 @@ IN_PROC_BROWSER_TEST_F( EXPECT_ECK(IsSupportedKeySystemWithMediaMimeType( "audio/webm", no_codecs(), kExternalClearKey)); EXPECT_ECK(IsSupportedKeySystemWithMediaMimeType( + "audio/webm", opus_codec(), kExternalClearKey)); + EXPECT_ECK(IsSupportedKeySystemWithMediaMimeType( "audio/webm", vorbis_codec(), kExternalClearKey)); // Non-audio codecs. EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( "audio/webm", vp8_codec(), kExternalClearKey)); EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( + "audio/webm", vp8_and_opus_codecs(), kExternalClearKey)); + EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( "audio/webm", vp8_and_vorbis_codecs(), kExternalClearKey)); EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( "audio/webm", vp9_codec(), kExternalClearKey)); EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( + "audio/webm", vp9_and_opus_codecs(), kExternalClearKey)); + EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( "audio/webm", vp9_and_vorbis_codecs(), kExternalClearKey)); // Non-Webm codec. @@ -809,6 +853,8 @@ IN_PROC_BROWSER_TEST_F( // Invalid or Non-MP4 codec. EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( + "audio/mp4", opus_codec(), kExternalClearKey)); + EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( "audio/mp4", vorbis_codec(), kExternalClearKey)); EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( "audio/mp4", mp4a_invalid_no_extension(), kExternalClearKey)); @@ -899,12 +945,18 @@ IN_PROC_BROWSER_TEST_F(EncryptedMediaIsTypeSupportedWidevineTest, EXPECT_WV(IsSupportedKeySystemWithMediaMimeType( "video/webm", vp80_codec(), kWidevineAlpha)); EXPECT_WV(IsSupportedKeySystemWithMediaMimeType( + "video/webm", vp8_and_opus_codecs(), kWidevineAlpha)); + EXPECT_WV(IsSupportedKeySystemWithMediaMimeType( "video/webm", vp8_and_vorbis_codecs(), kWidevineAlpha)); EXPECT_WV(IsSupportedKeySystemWithMediaMimeType( "video/webm", vp9_codec(), kWidevineAlpha)); EXPECT_WV(IsSupportedKeySystemWithMediaMimeType( "video/webm", vp90_codec(), kWidevineAlpha)); EXPECT_WV(IsSupportedKeySystemWithMediaMimeType( + "video/webm", vp9_and_opus_codecs(), kWidevineAlpha)); + EXPECT_WV(IsSupportedKeySystemWithMediaMimeType( + "video/webm", opus_codec(), kWidevineAlpha)); + EXPECT_WV(IsSupportedKeySystemWithMediaMimeType( "video/webm", vp9_and_vorbis_codecs(), kWidevineAlpha)); EXPECT_WV(IsSupportedKeySystemWithMediaMimeType( "video/webm", vorbis_codec(), kWidevineAlpha)); @@ -917,12 +969,18 @@ IN_PROC_BROWSER_TEST_F(EncryptedMediaIsTypeSupportedWidevineTest, EXPECT_WV(IsSupportedKeySystemWithMediaMimeType( "video/webm", vp80_codec(), kWidevine)); EXPECT_WV(IsSupportedKeySystemWithMediaMimeType( + "video/webm", vp8_and_opus_codecs(), kWidevine)); + EXPECT_WV(IsSupportedKeySystemWithMediaMimeType( "video/webm", vp8_and_vorbis_codecs(), kWidevine)); EXPECT_WV(IsSupportedKeySystemWithMediaMimeType( "video/webm", vp9_codec(), kWidevine)); EXPECT_WV(IsSupportedKeySystemWithMediaMimeType( "video/webm", vp90_codec(), kWidevine)); EXPECT_WV(IsSupportedKeySystemWithMediaMimeType( + "video/webm", vp9_and_opus_codecs(), kWidevine)); + EXPECT_WV(IsSupportedKeySystemWithMediaMimeType( + "video/webm", opus_codec(), kWidevine)); + EXPECT_WV(IsSupportedKeySystemWithMediaMimeType( "video/webm", vp9_and_vorbis_codecs(), kWidevine)); EXPECT_WV(IsSupportedKeySystemWithMediaMimeType( "video/webm", vorbis_codec(), kWidevine)); @@ -943,22 +1001,30 @@ IN_PROC_BROWSER_TEST_F(EncryptedMediaIsTypeSupportedWidevineTest, EXPECT_WV(IsSupportedKeySystemWithMediaMimeType( "audio/webm", no_codecs(), kWidevineAlpha)); EXPECT_WV(IsSupportedKeySystemWithMediaMimeType( + "audio/webm", opus_codec(), kWidevineAlpha)); + EXPECT_WV(IsSupportedKeySystemWithMediaMimeType( "audio/webm", vorbis_codec(), kWidevineAlpha)); // Valid audio types - parent key system. EXPECT_WV(IsSupportedKeySystemWithMediaMimeType( "audio/webm", no_codecs(), kWidevine)); EXPECT_WV(IsSupportedKeySystemWithMediaMimeType( + "audio/webm", opus_codec(), kWidevine)); + EXPECT_WV(IsSupportedKeySystemWithMediaMimeType( "audio/webm", vorbis_codec(), kWidevine)); // Non-audio codecs. EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( "audio/webm", vp8_codec(), kWidevineAlpha)); EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( + "audio/webm", vp8_and_opus_codecs(), kWidevineAlpha)); + EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( "audio/webm", vp8_and_vorbis_codecs(), kWidevineAlpha)); EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( "audio/webm", vp9_codec(), kWidevineAlpha)); EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( + "audio/webm", vp9_and_opus_codecs(), kWidevineAlpha)); + EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( "audio/webm", vp9_and_vorbis_codecs(), kWidevineAlpha)); // Non-Webm codec. @@ -1056,6 +1122,8 @@ IN_PROC_BROWSER_TEST_F(EncryptedMediaIsTypeSupportedWidevineTest, // Invalid or Non-MP4 codec. EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( + "audio/mp4", opus_codec(), kWidevineAlpha)); + EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( "audio/mp4", vorbis_codec(), kWidevineAlpha)); EXPECT_FALSE(IsSupportedKeySystemWithMediaMimeType( "audio/mp4", mp4a_invalid_no_extension(), kWidevineAlpha)); diff --git a/chrome/renderer/media/chrome_key_systems.cc b/chrome/renderer/media/chrome_key_systems.cc index 7ebb4fe..2af95c1 100644 --- a/chrome/renderer/media/chrome_key_systems.cc +++ b/chrome/renderer/media/chrome_key_systems.cc @@ -157,9 +157,15 @@ static void AddPepperBasedWidevine( &codecs); SupportedCodecs supported_codecs = media::EME_CODEC_NONE; + + // Audio codecs are always supported. + // TODO(sandersd): Include AAC here once the tests are updated. + // TODO(sandersd): Distinguish these from those that are directly supported, + // as those may offer a higher level of protection. + supported_codecs |= media::EME_CODEC_WEBM_OPUS; + supported_codecs |= media::EME_CODEC_WEBM_VORBIS; + for (size_t i = 0; i < codecs.size(); ++i) { - if (codecs[i] == kCdmSupportedCodecVorbis) - supported_codecs |= media::EME_CODEC_WEBM_VORBIS; if (codecs[i] == kCdmSupportedCodecVp8) supported_codecs |= media::EME_CODEC_WEBM_VP8; if (codecs[i] == kCdmSupportedCodecVp9) diff --git a/components/cdm/browser/cdm_message_filter_android.cc b/components/cdm/browser/cdm_message_filter_android.cc index a19a037..e9399f6 100644 --- a/components/cdm/browser/cdm_message_filter_android.cc +++ b/components/cdm/browser/cdm_message_filter_android.cc @@ -34,6 +34,7 @@ struct CodecInfo { }; const CodecInfo kCodecsToQuery[] = { + {media::EME_CODEC_WEBM_OPUS, CODEC_AUDIO, "opus", "video/webm"}, {media::EME_CODEC_WEBM_VORBIS, CODEC_AUDIO, "vorbis", "video/webm"}, {media::EME_CODEC_WEBM_VP8, CODEC_VIDEO, "vp8", "video/webm"}, {media::EME_CODEC_WEBM_VP9, CODEC_VIDEO, "vp9", "video/webm"}, diff --git a/content/browser/media/encrypted_media_browsertest.cc b/content/browser/media/encrypted_media_browsertest.cc index 3d56142..b693443 100644 --- a/content/browser/media/encrypted_media_browsertest.cc +++ b/content/browser/media/encrypted_media_browsertest.cc @@ -168,6 +168,30 @@ IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_VideoClearAudio_WebM) { TestSimplePlayback("bear-320x240-av_enc-v.webm", kWebMAudioVideo); } +IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_AudioOnly_WebM_Opus) { + // Opus is not supported on Android. http://crbug.com/318436 +#if defined(OS_ANDROID) + return; +#endif + TestSimplePlayback("bear-320x240-opus-a_enc-a.webm", kWebMAudioOnly); +} + +IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_VideoAudio_WebM_Opus) { + // Opus is not supported on Android. http://crbug.com/318436 +#if defined(OS_ANDROID) + return; +#endif + TestSimplePlayback("bear-320x240-opus-av_enc-av.webm", kWebMAudioVideo); +} + +IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_VideoClearAudio_WebM_Opus) { + // Opus is not supported on Android. http://crbug.com/318436 +#if defined(OS_ANDROID) + return; +#endif + TestSimplePlayback("bear-320x240-opus-av_enc-v.webm", kWebMAudioVideo); +} + IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, ConfigChangeVideo) { TestConfigChange(); } diff --git a/media/base/eme_constants.h b/media/base/eme_constants.h index 27ebfff..e78af3b 100644 --- a/media/base/eme_constants.h +++ b/media/base/eme_constants.h @@ -27,16 +27,17 @@ enum EmeCodec { // *_ALL values should only be used for masking, do not use them to specify // codec support because they may be extended to include more codecs. EME_CODEC_NONE = 0, - EME_CODEC_WEBM_VORBIS = 1 << 0, - EME_CODEC_WEBM_AUDIO_ALL = EME_CODEC_WEBM_VORBIS, - EME_CODEC_WEBM_VP8 = 1 << 1, - EME_CODEC_WEBM_VP9 = 1 << 2, + EME_CODEC_WEBM_OPUS = 1 << 0, + EME_CODEC_WEBM_VORBIS = 1 << 1, + EME_CODEC_WEBM_AUDIO_ALL = EME_CODEC_WEBM_OPUS | EME_CODEC_WEBM_VORBIS, + EME_CODEC_WEBM_VP8 = 1 << 2, + EME_CODEC_WEBM_VP9 = 1 << 3, EME_CODEC_WEBM_VIDEO_ALL = (EME_CODEC_WEBM_VP8 | EME_CODEC_WEBM_VP9), EME_CODEC_WEBM_ALL = (EME_CODEC_WEBM_AUDIO_ALL | EME_CODEC_WEBM_VIDEO_ALL), #if defined(USE_PROPRIETARY_CODECS) - EME_CODEC_MP4_AAC = 1 << 3, + EME_CODEC_MP4_AAC = 1 << 4, EME_CODEC_MP4_AUDIO_ALL = EME_CODEC_MP4_AAC, - EME_CODEC_MP4_AVC1 = 1 << 4, + EME_CODEC_MP4_AVC1 = 1 << 5, EME_CODEC_MP4_VIDEO_ALL = EME_CODEC_MP4_AVC1, EME_CODEC_MP4_ALL = (EME_CODEC_MP4_AUDIO_ALL | EME_CODEC_MP4_VIDEO_ALL), EME_CODEC_ALL = (EME_CODEC_WEBM_ALL | EME_CODEC_MP4_ALL), diff --git a/media/base/key_systems.cc b/media/base/key_systems.cc index b98e4df..f97660c 100644 --- a/media/base/key_systems.cc +++ b/media/base/key_systems.cc @@ -60,6 +60,7 @@ static NamedCodec kContainerToCodecMasks[] = { // Mapping between codec names and enum values. static NamedCodec kCodecStrings[] = { + {"opus", EME_CODEC_WEBM_OPUS}, {"vorbis", EME_CODEC_WEBM_VORBIS}, {"vp8", EME_CODEC_WEBM_VP8}, {"vp8.0", EME_CODEC_WEBM_VP8}, @@ -86,6 +87,10 @@ static void AddClearKey(std::vector<KeySystemInfo>* concrete_key_systems) { // Temporarily disable VP9 support for Android. // TODO(xhwang): Use mime_util.h to query VP9 support on Android. info.supported_codecs &= ~EME_CODEC_WEBM_VP9; + + // Opus is not supported on Android yet. http://crbug.com/318436. + // TODO(sandersd): Check for platform support to set this bit. + info.supported_codecs &= ~EME_CODEC_WEBM_OPUS; #endif // defined(OS_ANDROID) #if defined(USE_PROPRIETARY_CODECS) |