| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <string> |
| |
| #include "base/macros.h" |
| #include "build/build_config.h" |
| #include "content/browser/media/media_browsertest.h" |
| #include "content/public/test/browser_test_utils.h" |
| #include "content/public/test/content_browser_test_utils.h" |
| #include "content/shell/browser/shell.h" |
| #include "media/media_features.h" |
| |
| #if defined(OS_ANDROID) |
| #include "base/android/build_info.h" |
| #endif |
| |
| const char kProbably[] = "probably"; |
| const char kMaybe[] = "maybe"; |
| const char kNot[] = ""; |
| |
| #if defined(USE_PROPRIETARY_CODECS) |
| const char kPropProbably[] = "probably"; |
| const char kPropMaybe[] = "maybe"; |
| #else |
| const char kPropProbably[] = ""; |
| const char kPropMaybe[] = ""; |
| #endif // USE_PROPRIETARY_CODECS |
| |
| #if !defined(OS_ANDROID) |
| const char kOggVideoProbably[] = "probably"; |
| const char kOggVideoMaybe[] = "maybe"; |
| const char kTheoraProbably[] = "probably"; |
| const char kOggOpusProbably[] = "probably"; |
| const char* kMpeg2AacProbably = kPropProbably; |
| #else |
| const char kOggVideoProbably[] = ""; |
| const char kOggVideoMaybe[] = ""; |
| const char kTheoraProbably[] = ""; |
| const char kOggOpusProbably[] = ""; |
| const char kMpeg2AacProbably[] = ""; |
| #endif // !OS_ANDROID |
| |
| #if BUILDFLAG(ENABLE_HEVC_DEMUXING) |
| const char* kHevcSupported = kPropProbably; |
| #else |
| const char* kHevcSupported = kNot; |
| #endif |
| |
| #if BUILDFLAG(ENABLE_MSE_MPEG2TS_STREAM_PARSER) |
| const char* kMp2tsMaybe = kPropMaybe; |
| const char* kMp2tsProbably = kPropProbably; |
| #else |
| const char* kMp2tsMaybe = kNot; |
| const char* kMp2tsProbably = kNot; |
| #endif |
| |
| #if BUILDFLAG(ENABLE_AC3_EAC3_AUDIO_DEMUXING) |
| const char* kAc3Eac3Probably = kPropProbably; |
| #else |
| const char* kAc3Eac3Probably = kNot; |
| #endif |
| |
| #if BUILDFLAG(ENABLE_MSE_MPEG2TS_STREAM_PARSER) && \ |
| BUILDFLAG(ENABLE_AC3_EAC3_AUDIO_DEMUXING) |
| const char* kMp2tsAc3Eac3Probably = kPropProbably; |
| #else |
| const char* kMp2tsAc3Eac3Probably = kNot; |
| #endif |
| |
| namespace content { |
| |
| class MediaCanPlayTypeTest : public MediaBrowserTest { |
| public: |
| MediaCanPlayTypeTest() : url_("about:blank") { } |
| |
| void SetUpOnMainThread() override { NavigateToURL(shell(), url_); } |
| |
| std::string CanPlay(const std::string& type) { |
| std::string command("document.createElement('video').canPlayType("); |
| command.append(type); |
| command.append(")"); |
| |
| std::string result; |
| EXPECT_TRUE(ExecuteScriptAndExtractString( |
| shell()->web_contents(), |
| "window.domAutomationController.send(" + command + ");", |
| &result)); |
| return result; |
| } |
| |
| void TestMPEGUnacceptableCombinations(const std::string& mime) { |
| // AVC codecs must be followed by valid 6-digit hexadecimal number. |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.12345\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3.12345\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.1234567\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3.1234567\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.number\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3.number\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.12345.\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3.12345.\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.123456.\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3.123456.\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.123456.7\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3.123456.7\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.x23456\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.1x3456\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.12x456\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.123x56\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.1234x6\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.12345x\"'")); |
| |
| // Old-style avc1 codecs must be followed by two dot-separated decimal |
| // numbers (H.264 profile and level) |
| // Invalid formats |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1..\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.66.\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.66.30.\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.x66.30\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.66x.30\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.66.x30\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.66.30x\"'")); |
| // Invalid level values |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.66.300\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.66.-1\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.66.x\"'")); |
| // Invalid profile values |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.0.30\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.65.30\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.67.30\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.76.30\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.78.30\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.99.30\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.101.30\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.300.30\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.-1.30\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.x.30\"'")); |
| |
| // AAC codecs must be followed by one or two valid hexadecimal numbers. |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.no\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.0k\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.0k.0k\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.4.\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.40.0k\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.40.\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.40k\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.40.2k\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.40.2k\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.40.2.\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.40.2.0\"'")); |
| |
| // Unlike just "avc1", just "mp4a" is not supported. |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.\"'")); |
| |
| // Other names for the codecs are not supported. |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"h264\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"h.264\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"H264\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"H.264\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"aac\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"AAC\"'")); |
| |
| // Codecs must not end with a dot. |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3.\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.40.\"'")); |
| |
| // A simple substring match is not sufficient. |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"lavc1337\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\";mp4a+\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\";mp4a.40+\"'")); |
| |
| // Codecs not belonging to MPEG container. |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vorbis\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1, vorbis\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3, vorbis\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.4D401E, vorbis\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3.64001F, vorbis\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"opus\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1, opus\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3, opus\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.4D401E, opus\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3.64001F, opus\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp8\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp9\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp8, mp4a.40\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp9, mp4a.40\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp8, mp4a.40.2\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp9, mp4a.40.2\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp8, mp4a.40.02\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp9, mp4a.40.02\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"1\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1, 1\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3, 1\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1.4D401E, 1\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3.64001F, 1\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"theora\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"theora, mp4a\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"theora, mp4a.40.2\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"theora, mp4a.40.02\"'")); |
| |
| // Codecs are case sensitive. |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"AVC1\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"AVC1.4d401e\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"AVC3\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"AVC3.64001f\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"MP4A\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"MP4A.40.2\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"MP4A.40.02\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"AVC1, MP4\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"AVC3, MP4\"'")); |
| EXPECT_EQ(kNot, |
| CanPlay("'" + mime + "; codecs=\", AVC1.4D401E, MP4.40.2\"'")); |
| EXPECT_EQ(kNot, |
| CanPlay("'" + mime + "; codecs=\", AVC3.64001F, MP4.40.2\"'")); |
| EXPECT_EQ(kNot, |
| CanPlay("'" + mime + "; codecs=\", AVC1.4D401E, MP4.40.02\"'")); |
| EXPECT_EQ(kNot, |
| CanPlay("'" + mime + "; codecs=\", AVC3.64001F, MP4.40.02\"'")); |
| |
| // Unknown codecs. |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc2\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc4\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1x\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3x\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4ax\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"ac\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"ec\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"ac-\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"ec-\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"ac-2\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"ec-2\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"ac3\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"ec3\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"ac-4\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"ec-4\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.a4\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.a7\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.a5.\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.a6.\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.a5.1\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.a6.1\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"unknown\"'")); |
| |
| // Don't allow incomplete/ambiguous codec ids for HEVC. |
| // Codec string must have info about codec level/profile, as described in |
| // ISO/IEC FDIS 14496-15 section E.3, for example "hev1.1.6.L93.B0" |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev1\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc1\"'")); |
| |
| // Invalid codecs that look like something similar to HEVC/H.265 |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev1x\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc1x\"'")); |
| // First component of codec id must be "hev1" or "hvc1" (case-sensitive) |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hevc.1.6.L93.B0\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev0.1.6.L93.B0\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc0.1.6.L93.B0\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev2.1.6.L93.B0\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc2.1.6.L93.B0\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"HEVC.1.6.L93.B0\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"HEV0.1.6.L93.B0\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"HVC0.1.6.L93.B0\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"HEV2.1.6.L93.B0\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"HVC2.1.6.L93.B0\"'")); |
| |
| // TODO(servolk): Uncomment these after crbug.com/482761 is fixed. |
| // Trailing dot is not allowed. |
| //EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev1.1.6.L93.B0.\"'")); |
| //EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc1.1.6.L93.B0.\"'")); |
| // Invalid general_profile_space/general_profile_idc |
| //EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev1.x.6.L93.B0\"'")); |
| //EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc1.x.6.L93.B0\"'")); |
| //EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev1.d1.6.L93.B0\"'")); |
| //EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc1.d1.6.L93.B0\"'")); |
| // Invalid general_profile_compatibility_flags |
| //EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev1.1.x.L93.B0\"'")); |
| //EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc1.1.x.L93.B0\"'")); |
| // Invalid general_tier_flag |
| //EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev1.1.6.x.B0\"'")); |
| //EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc1.1.6.x.B0\"'")); |
| //EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev1.1.6.Lx.B0\"'")); |
| //EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc1.1.6.Lx.B0\"'")); |
| //EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev1.1.6.Hx.B0\"'")); |
| //EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc1.1.6.Hx.B0\"'")); |
| // Invalid constraint flags |
| //EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev1.1.6.L93.x\"'")); |
| //EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc1.1.6.L93.x\"'")); |
| } |
| |
| void TestOGGUnacceptableCombinations(const std::string& mime) { |
| // Codecs not belonging to OGG container. |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"vp8\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"vp8.0\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"vp8, opus\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"vp8, vorbis\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"vp9\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"vp9.0\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"vp9, opus\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"vp9, vorbis\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"avc1\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"avc3\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"avc1.4D401E\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"avc3.64001F\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"avc1.66.30\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"avc1, vorbis\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"avc3, vorbis\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"avc1, opus\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"avc3, opus\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev1.1.6.L93.B0\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc1.1.6.L93.B0\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev1.1.6.L93.B0,opus\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc1.1.6.L93.B0,opus\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"mp4a.40\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"mp4a.40.2\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"mp4a.40.02\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"theora, mp4a.40.2\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"theora, mp4a.40.02\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"ac-3\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"ec-3\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.A5\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.A6\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.a5\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.a6\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"1\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"theora, 1\"'")); |
| |
| // Codecs are case sensitive. |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"Theora\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"Opus\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"Vorbis\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"Theora, Opus\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"Theora, Vorbis\"'")); |
| |
| // Unknown codecs. |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"unknown\"'")); |
| } |
| |
| void TestWEBMUnacceptableCombinations(const std::string& mime) { |
| // Codecs not belonging to WEBM container. |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"1\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"vp8, 1\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"vp9, 1\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"vp8.0, 1\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"vp9.0, 1\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"theora\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"theora, vorbis\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"theora, opus\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"avc1\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"avc3\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"avc1.4D401E\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"avc3.64001F\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"avc1.66.30\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"avc1, vorbis\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"avc3, vorbis\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"avc1, opus\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"avc3, opus\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev1.1.6.L93.B0\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc1.1.6.L93.B0\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev1.1.6.L93.B0,opus\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc1.1.6.L93.B0,opus\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"mp4a.40\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"mp4a.40.2\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"mp4a.40.02\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"vp8, mp4a.40\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"vp9, mp4a.40\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"vp8.0, mp4a.40\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"vp9.0, mp4a.40\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"ac-3\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"ec-3\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.A5\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.A6\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.a5\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.a6\"'")); |
| |
| // Codecs are case sensitive. |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"VP8, Vorbis\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"VP8.0, Opus\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"VP9, Vorbis\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"VP9.0, Opus\"'")); |
| |
| // Unknown codec. |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"unknown\"'")); |
| } |
| |
| void TestWAVUnacceptableCombinations(const std::string& mime) { |
| // Codecs not belonging to WAV container. |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"vp8\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"vp9\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"vp8.0, 1\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"vp9.0, 1\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"vorbis\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"opus\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"theora\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"theora, 1\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"avc1\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"avc3\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"avc1.4D401E\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"avc3.64001F\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"avc1.66.30\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"avc1, 1\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"avc3, 1\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev1.1.6.L93.B0\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc1.1.6.L93.B0\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hev1.1.6.L93.B0,opus\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"hvc1.1.6.L93.B0,opus\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"mp4a.40\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"mp4a.40.2\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"mp4a.40.02\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"ac-3\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"ec-3\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.A5\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.A6\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.a5\"'")); |
| EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"mp4a.a6\"'")); |
| |
| // Unknown codec. |
| EXPECT_EQ(kNot, CanPlay("'" + mime +"; codecs=\"unknown\"'")); |
| } |
| |
| private: |
| GURL url_; |
| DISALLOW_COPY_AND_ASSIGN(MediaCanPlayTypeTest); |
| }; |
| |
| IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_wav) { |
| EXPECT_EQ(kMaybe, CanPlay("'audio/wav'")); |
| EXPECT_EQ(kProbably, CanPlay("'audio/wav; codecs=\"1\"'")); |
| |
| TestWAVUnacceptableCombinations("audio/wav"); |
| |
| EXPECT_EQ(kMaybe, CanPlay("'audio/x-wav'")); |
| EXPECT_EQ(kProbably, CanPlay("'audio/x-wav; codecs=\"1\"'")); |
| |
| TestWAVUnacceptableCombinations("audio/x-wav"); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_webm) { |
| // On Android, VP9 is supported only on KitKat and above (API level 19) and |
| // Opus is supported only on Lollipop and above (API level 21). |
| std::string VP9Probably = "probably"; |
| std::string VP9AndOpusProbably = "probably"; |
| std::string OpusProbably = "probably"; |
| #if defined(OS_ANDROID) |
| if (base::android::BuildInfo::GetInstance()->sdk_int() < 19) |
| VP9Probably = ""; |
| if (base::android::BuildInfo::GetInstance()->sdk_int() < 21) { |
| OpusProbably = ""; |
| VP9AndOpusProbably = ""; |
| } |
| #endif |
| EXPECT_EQ(kMaybe, CanPlay("'video/webm'")); |
| |
| EXPECT_EQ(kProbably, CanPlay("'video/webm; codecs=\"vp8\"'")); |
| EXPECT_EQ(kProbably, CanPlay("'video/webm; codecs=\"vp8.0\"'")); |
| EXPECT_EQ(kProbably, CanPlay("'video/webm; codecs=\"vp8, vorbis\"'")); |
| EXPECT_EQ(kProbably, CanPlay("'video/webm; codecs=\"vp8.0, vorbis\"'")); |
| EXPECT_EQ(OpusProbably, CanPlay("'video/webm; codecs=\"vp8, opus\"'")); |
| EXPECT_EQ(OpusProbably, CanPlay("'video/webm; codecs=\"vp8.0, opus\"'")); |
| |
| EXPECT_EQ(VP9Probably, CanPlay("'video/webm; codecs=\"vp9\"'")); |
| EXPECT_EQ(VP9Probably, CanPlay("'video/webm; codecs=\"vp9.0\"'")); |
| EXPECT_EQ(VP9Probably, CanPlay("'video/webm; codecs=\"vp9, vorbis\"'")); |
| EXPECT_EQ(VP9Probably, CanPlay("'video/webm; codecs=\"vp9.0, vorbis\"'")); |
| EXPECT_EQ(VP9AndOpusProbably, CanPlay("'video/webm; codecs=\"vp9, opus\"'")); |
| EXPECT_EQ(VP9AndOpusProbably, |
| CanPlay("'video/webm; codecs=\"vp9.0, opus\"'")); |
| |
| EXPECT_EQ(VP9Probably, CanPlay("'video/webm; codecs=\"vp8, vp9\"'")); |
| EXPECT_EQ(VP9Probably, CanPlay("'video/webm; codecs=\"vp8.0, vp9.0\"'")); |
| |
| TestWEBMUnacceptableCombinations("video/webm"); |
| |
| EXPECT_EQ(kMaybe, CanPlay("'audio/webm'")); |
| EXPECT_EQ(kProbably, CanPlay("'audio/webm; codecs=\"vorbis\"'")); |
| EXPECT_EQ(OpusProbably, CanPlay("'audio/webm; codecs=\"opus\"'")); |
| EXPECT_EQ(OpusProbably, CanPlay("'audio/webm; codecs=\"opus, vorbis\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'audio/webm; codecs=\"vp8\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/webm; codecs=\"vp8.0\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/webm; codecs=\"vp8, vorbis\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/webm; codecs=\"vp8.0, vorbis\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/webm; codecs=\"vp8, opus\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/webm; codecs=\"vp8.0, opus\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'audio/webm; codecs=\"vp9\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/webm; codecs=\"vp9.0\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/webm; codecs=\"vp9, vorbis\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/webm; codecs=\"vp9.0, vorbis\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/webm; codecs=\"vp9, opus\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/webm; codecs=\"vp9.0, opus\"'")); |
| |
| TestWEBMUnacceptableCombinations("audio/webm"); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_ogg) { |
| EXPECT_EQ(kOggVideoMaybe, CanPlay("'video/ogg'")); |
| EXPECT_EQ(kOggVideoProbably, CanPlay("'video/ogg; codecs=\"theora\"'")); |
| EXPECT_EQ(kOggVideoProbably, |
| CanPlay("'video/ogg; codecs=\"theora, vorbis\"'")); |
| EXPECT_EQ(kOggVideoProbably, |
| CanPlay("'video/ogg; codecs=\"theora, opus\"'")); |
| EXPECT_EQ(kOggVideoProbably, |
| CanPlay("'video/ogg; codecs=\"opus, vorbis\"'")); |
| |
| TestOGGUnacceptableCombinations("video/ogg"); |
| |
| EXPECT_EQ(kMaybe, CanPlay("'audio/ogg'")); |
| EXPECT_EQ(kProbably, CanPlay("'audio/ogg; codecs=\"vorbis\"'")); |
| EXPECT_EQ(kOggOpusProbably, CanPlay("'audio/ogg; codecs=\"opus\"'")); |
| EXPECT_EQ(kOggOpusProbably, CanPlay("'audio/ogg; codecs=\"vorbis, opus\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'audio/ogg; codecs=\"theora\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/ogg; codecs=\"theora, opus\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/ogg; codecs=\"theora, vorbis\"'")); |
| |
| TestOGGUnacceptableCombinations("audio/ogg"); |
| |
| EXPECT_EQ(kMaybe, CanPlay("'application/ogg'")); |
| EXPECT_EQ(kProbably, CanPlay("'application/ogg; codecs=\"vorbis\"'")); |
| EXPECT_EQ(kTheoraProbably, CanPlay("'application/ogg; codecs=\"theora\"'")); |
| EXPECT_EQ(kOggOpusProbably, CanPlay("'application/ogg; codecs=\"opus\"'")); |
| EXPECT_EQ(kTheoraProbably, |
| CanPlay("'application/ogg; codecs=\"theora, vorbis\"'")); |
| EXPECT_EQ(kTheoraProbably, |
| CanPlay("'application/ogg; codecs=\"theora, opus\"'")); |
| EXPECT_EQ(kOggOpusProbably, |
| CanPlay("'application/ogg; codecs=\"opus, vorbis\"'")); |
| |
| TestOGGUnacceptableCombinations("application/ogg"); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_mp3) { |
| EXPECT_EQ(kNot, CanPlay("'video/mp3'")); |
| EXPECT_EQ(kNot, CanPlay("'video/mpeg'")); |
| EXPECT_EQ(kNot, CanPlay("'video/x-mp3'")); |
| |
| // audio/mpeg without a codecs parameter (RFC 3003 compliant) |
| EXPECT_EQ(kPropProbably, CanPlay("'audio/mpeg'")); |
| |
| // audio/mpeg with mp3 in codecs parameter. (Not RFC compliant, but |
| // very common in the wild so it is a defacto standard). |
| EXPECT_EQ(kPropProbably, CanPlay("'audio/mpeg; codecs=\"mp3\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'audio/mpeg; codecs=\"avc1\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mpeg; codecs=\"avc3\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'audio/mpeg; codecs=\"avc1.4D401E\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mpeg; codecs=\"avc3.64001F\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mpeg; codecs=\"avc1.66.30\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'audio/mpeg; codecs=\"mp4a.40.2\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mpeg; codecs=\"mp4a.40.02\"'")); |
| |
| TestMPEGUnacceptableCombinations("audio/mpeg"); |
| |
| // audio/mp3 does not allow any codecs parameter |
| EXPECT_EQ(kPropProbably, CanPlay("'audio/mp3'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'audio/mp3; codecs=\"avc1\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp3; codecs=\"avc3\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'audio/mp3; codecs=\"avc1.4D401E\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp3; codecs=\"avc3.64001F\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp3; codecs=\"avc1.66.30\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'audio/mp3; codecs=\"mp4a.40.2\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp3; codecs=\"mp4a.40.02\"'")); |
| |
| TestMPEGUnacceptableCombinations("audio/mp3"); |
| |
| // audio/x-mp3 does not allow any codecs parameter |
| EXPECT_EQ(kPropProbably, CanPlay("'audio/x-mp3'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'audio/x-mp3; codecs=\"avc1\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/x-mp3; codecs=\"avc3\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'audio/x-mp3; codecs=\"avc1.4D401E\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/x-mp3; codecs=\"avc3.64001F\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/x-mp3; codecs=\"avc1.66.30\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'audio/x-mp3; codecs=\"mp4a.40.2\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/x-mp3; codecs=\"mp4a.40.02\"'")); |
| |
| TestMPEGUnacceptableCombinations("audio/x-mp3"); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_mp4) { |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4'")); |
| |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc3\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"mp4a.40\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1, mp4a.40\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc3, mp4a.40\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1, avc3\"'")); |
| |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E01E\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.42E01E\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.42801E\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.42C01E\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc1.66.13\"'")); |
| EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc1.77.30\"'")); |
| EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc1.100.40\"'")); |
| |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E11E\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42101E\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42701E\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42F01E\"'")); |
| |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"mp4a.40.2\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"mp4a.40.02\"'")); |
| EXPECT_EQ(kPropProbably, |
| CanPlay("'video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"'")); |
| EXPECT_EQ(kPropProbably, |
| CanPlay("'video/mp4; codecs=\"avc1.42E01E, mp4a.40.02\"'")); |
| EXPECT_EQ(kPropProbably, |
| CanPlay("'video/mp4; codecs=\"avc3.42E01E, mp4a.40.5\"'")); |
| EXPECT_EQ(kPropProbably, |
| CanPlay("'video/mp4; codecs=\"avc3.42E01E, mp4a.40.05\"'")); |
| EXPECT_EQ(kPropProbably, |
| CanPlay("'video/mp4; codecs=\"avc3.42E01E, mp4a.40.29\"'")); |
| |
| // AC3 and EAC3 (aka Dolby Digital Plus, DD+) audio codecs. |
| // TODO(servolk): Strictly speaking only mp4a.A5 and mp4a.A6 codec ids are |
| // valid according to RFC 6381 section 3.3, 3.4. Lower-case oti (mp4a.a5 and |
| // mp4a.a6) should be rejected. But we used to allow those in older versions |
| // of Chromecast firmware and some apps (notably MPL) depend on those codec |
| // types being supported, so they should be allowed for now (crbug.com/564960) |
| EXPECT_EQ(kAc3Eac3Probably, CanPlay("'video/mp4; codecs=\"ac-3\"'")); |
| EXPECT_EQ(kAc3Eac3Probably, CanPlay("'video/mp4; codecs=\"mp4a.a5\"'")); |
| EXPECT_EQ(kAc3Eac3Probably, CanPlay("'video/mp4; codecs=\"mp4a.A5\"'")); |
| EXPECT_EQ(kAc3Eac3Probably, CanPlay("'video/mp4; codecs=\"ec-3\"'")); |
| EXPECT_EQ(kAc3Eac3Probably, CanPlay("'video/mp4; codecs=\"mp4a.a6\"'")); |
| EXPECT_EQ(kAc3Eac3Probably, CanPlay("'video/mp4; codecs=\"mp4a.A6\"'")); |
| EXPECT_EQ(kAc3Eac3Probably, |
| CanPlay("'video/mp4; codecs=\"avc1.640028,ac-3\"'")); |
| EXPECT_EQ(kAc3Eac3Probably, |
| CanPlay("'video/mp4; codecs=\"avc1.640028,mp4a.a5\"'")); |
| EXPECT_EQ(kAc3Eac3Probably, |
| CanPlay("'video/mp4; codecs=\"avc1.640028,mp4a.A5\"'")); |
| EXPECT_EQ(kAc3Eac3Probably, |
| CanPlay("'video/mp4; codecs=\"avc1.640028,ec-3\"'")); |
| EXPECT_EQ(kAc3Eac3Probably, |
| CanPlay("'video/mp4; codecs=\"avc1.640028,mp4a.a6\"'")); |
| EXPECT_EQ(kAc3Eac3Probably, |
| CanPlay("'video/mp4; codecs=\"avc1.640028,mp4a.A6\"'")); |
| |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1, mp4a.40.2\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1, mp4a.40.02\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc3, mp4a.40.2\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc3, mp4a.40.02\"'")); |
| EXPECT_EQ(kPropMaybe, |
| CanPlay("'video/mp4; codecs=\"avc1.42E01E, mp4a.40\"'")); |
| EXPECT_EQ(kPropMaybe, |
| CanPlay("'video/mp4; codecs=\"avc3.42E01E, mp4a.40\"'")); |
| |
| // TODO(servolk): Add more unit test coverage once we have more info about |
| // various HEVC levels/profiles (crbug.com/482761). |
| EXPECT_EQ(kHevcSupported, CanPlay("'video/mp4; codecs=\"hev1.1.6.L93.B0\"'")); |
| EXPECT_EQ(kHevcSupported, CanPlay("'video/mp4; codecs=\"hvc1.1.6.L93.B0\"'")); |
| EXPECT_EQ(kHevcSupported, |
| CanPlay("'video/mp4; codecs=\"hev1.1.6.L93.B0, mp4a.40.5\"'")); |
| EXPECT_EQ(kHevcSupported, |
| CanPlay("'video/mp4; codecs=\"hvc1.1.6.L93.B0, mp4a.40.5\"'")); |
| |
| TestMPEGUnacceptableCombinations("video/mp4"); |
| |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/x-m4v'")); |
| |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/x-m4v; codecs=\"avc1\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/x-m4v; codecs=\"avc3\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/x-m4v; codecs=\"mp4a.40\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/x-m4v; codecs=\"avc1, mp4a.40\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/x-m4v; codecs=\"avc3, mp4a.40\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/x-m4v; codecs=\"avc1, avc3\"'")); |
| |
| EXPECT_EQ(kPropProbably, CanPlay("'video/x-m4v; codecs=\"avc1.42E01E\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/x-m4v; codecs=\"avc3.42E01E\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/x-m4v; codecs=\"avc3.42801E\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/x-m4v; codecs=\"avc3.42C01E\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'video/x-m4v; codecs=\"avc1.66.13\"'")); |
| EXPECT_EQ(kNot, CanPlay("'video/x-m4v; codecs=\"avc1.77.30\"'")); |
| EXPECT_EQ(kNot, CanPlay("'video/x-m4v; codecs=\"avc1.100.40\"'")); |
| |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/x-m4v; codecs=\"avc1.42E11E\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/x-m4v; codecs=\"avc1.42101E\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/x-m4v; codecs=\"avc1.42701E\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/x-m4v; codecs=\"avc1.42F01E\"'")); |
| |
| EXPECT_EQ(kPropProbably, CanPlay("'video/x-m4v; codecs=\"mp4a.40.2\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/x-m4v; codecs=\"mp4a.40.02\"'")); |
| EXPECT_EQ(kPropProbably, |
| CanPlay("'video/x-m4v; codecs=\"avc1.42E01E, mp4a.40.2\"'")); |
| EXPECT_EQ(kPropProbably, |
| CanPlay("'video/x-m4v; codecs=\"avc1.42E01E, mp4a.40.02\"'")); |
| EXPECT_EQ(kPropProbably, |
| CanPlay("'video/x-m4v; codecs=\"avc3.42E01E, mp4a.40.5\"'")); |
| EXPECT_EQ(kPropProbably, |
| CanPlay("'video/x-m4v; codecs=\"avc3.42E01E, mp4a.40.05\"'")); |
| EXPECT_EQ(kPropProbably, |
| CanPlay("'video/x-m4v; codecs=\"avc3.42E01E, mp4a.40.29\"'")); |
| |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/x-m4v; codecs=\"avc1, mp4a.40.2\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/x-m4v; codecs=\"avc1, mp4a.40.02\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/x-m4v; codecs=\"avc3, mp4a.40.2\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/x-m4v; codecs=\"avc3, mp4a.40.02\"'")); |
| EXPECT_EQ(kPropMaybe, |
| CanPlay("'video/x-m4v; codecs=\"avc1.42E01E, mp4a.40\"'")); |
| EXPECT_EQ(kPropMaybe, |
| CanPlay("'video/x-m4v; codecs=\"avc3.42E01E, mp4a.40\"'")); |
| |
| EXPECT_EQ(kHevcSupported, |
| CanPlay("'video/x-m4v; codecs=\"hev1.1.6.L93.B0\"'")); |
| EXPECT_EQ(kHevcSupported, |
| CanPlay("'video/x-m4v; codecs=\"hvc1.1.6.L93.B0\"'")); |
| EXPECT_EQ(kHevcSupported, |
| CanPlay("'video/x-m4v; codecs=\"hev1.1.6.L93.B0, mp4a.40.5\"'")); |
| EXPECT_EQ(kHevcSupported, |
| CanPlay("'video/x-m4v; codecs=\"hvc1.1.6.L93.B0, mp4a.40.5\"'")); |
| |
| EXPECT_EQ(kAc3Eac3Probably, CanPlay("'video/x-m4v; codecs=\"ac-3\"'")); |
| EXPECT_EQ(kAc3Eac3Probably, CanPlay("'video/x-m4v; codecs=\"mp4a.a5\"'")); |
| EXPECT_EQ(kAc3Eac3Probably, CanPlay("'video/x-m4v; codecs=\"mp4a.A5\"'")); |
| EXPECT_EQ(kAc3Eac3Probably, CanPlay("'video/x-m4v; codecs=\"ec-3\"'")); |
| EXPECT_EQ(kAc3Eac3Probably, CanPlay("'video/x-m4v; codecs=\"mp4a.a6\"'")); |
| EXPECT_EQ(kAc3Eac3Probably, CanPlay("'video/x-m4v; codecs=\"mp4a.A6\"'")); |
| EXPECT_EQ(kAc3Eac3Probably, |
| CanPlay("'video/x-m4v; codecs=\"avc1.640028,ac-3\"'")); |
| EXPECT_EQ(kAc3Eac3Probably, |
| CanPlay("'video/x-m4v; codecs=\"avc1.640028,mp4a.a5\"'")); |
| EXPECT_EQ(kAc3Eac3Probably, |
| CanPlay("'video/x-m4v; codecs=\"avc1.640028,mp4a.A5\"'")); |
| EXPECT_EQ(kAc3Eac3Probably, |
| CanPlay("'video/x-m4v; codecs=\"avc1.640028,ec-3\"'")); |
| EXPECT_EQ(kAc3Eac3Probably, |
| CanPlay("'video/x-m4v; codecs=\"avc1.640028,mp4a.a6\"'")); |
| EXPECT_EQ(kAc3Eac3Probably, |
| CanPlay("'video/x-m4v; codecs=\"avc1.640028,mp4a.A6\"'")); |
| |
| TestMPEGUnacceptableCombinations("video/x-m4v"); |
| |
| EXPECT_EQ(kPropMaybe, CanPlay("'audio/mp4'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'audio/mp4; codecs=\"mp4a.40\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'audio/mp4; codecs=\"mp4a.40.2\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'audio/mp4; codecs=\"mp4a.40.02\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'audio/mp4; codecs=\"mp4a.40.5\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'audio/mp4; codecs=\"mp4a.40.05\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'audio/mp4; codecs=\"mp4a.40.29\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"avc1\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"avc3\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"avc1, mp4a.40\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"avc3, mp4a.40\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"avc1.4D401E\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"avc3.64001F\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"avc1.66.30\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"hev1.1.6.L93.B0\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"hvc1.1.6.L93.B0\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"hev1.1.6.L93.B0,mp4a.40.5\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"hvc1.1.6.L93.B0,mp4a.40.5\"'")); |
| |
| EXPECT_EQ(kAc3Eac3Probably, CanPlay("'audio/mp4; codecs=\"ac-3\"'")); |
| EXPECT_EQ(kAc3Eac3Probably, CanPlay("'audio/mp4; codecs=\"mp4a.a5\"'")); |
| EXPECT_EQ(kAc3Eac3Probably, CanPlay("'audio/mp4; codecs=\"mp4a.A5\"'")); |
| EXPECT_EQ(kAc3Eac3Probably, CanPlay("'audio/mp4; codecs=\"ec-3\"'")); |
| EXPECT_EQ(kAc3Eac3Probably, CanPlay("'audio/mp4; codecs=\"mp4a.a6\"'")); |
| EXPECT_EQ(kAc3Eac3Probably, CanPlay("'audio/mp4; codecs=\"mp4a.A6\"'")); |
| |
| TestMPEGUnacceptableCombinations("audio/mp4"); |
| |
| EXPECT_EQ(kPropMaybe, CanPlay("'audio/x-m4a'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'audio/x-m4a; codecs=\"mp4a.40\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'audio/x-m4a; codecs=\"mp4a.40.2\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'audio/x-m4a; codecs=\"mp4a.40.02\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'audio/x-m4a; codecs=\"mp4a.40.5\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'audio/x-m4a; codecs=\"mp4a.40.05\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'audio/x-m4a; codecs=\"mp4a.40.29\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'audio/x-m4a; codecs=\"avc1\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/x-m4a; codecs=\"avc3\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/x-m4a; codecs=\"avc1, mp4a\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/x-m4a; codecs=\"avc3, mp4a\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'audio/x-m4a; codecs=\"avc1.4D401E\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/x-m4a; codecs=\"avc3.64001F\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/x-m4a; codecs=\"avc1.66.30\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'audio/x-m4a; codecs=\"hev1.1.6.L93.B0\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/x-m4a; codecs=\"hvc1.1.6.L93.B0\"'")); |
| EXPECT_EQ(kNot, |
| CanPlay("'audio/x-m4a; codecs=\"hev1.1.6.L93.B0, mp4a.40.5\"'")); |
| EXPECT_EQ(kNot, |
| CanPlay("'audio/x-m4a; codecs=\"hvc1.1.6.L93.B0, mp4a.40.5\"'")); |
| |
| EXPECT_EQ(kAc3Eac3Probably, CanPlay("'audio/x-m4a; codecs=\"ac-3\"'")); |
| EXPECT_EQ(kAc3Eac3Probably, CanPlay("'audio/x-m4a; codecs=\"mp4a.a5\"'")); |
| EXPECT_EQ(kAc3Eac3Probably, CanPlay("'audio/x-m4a; codecs=\"mp4a.A5\"'")); |
| EXPECT_EQ(kAc3Eac3Probably, CanPlay("'audio/x-m4a; codecs=\"ec-3\"'")); |
| EXPECT_EQ(kAc3Eac3Probably, CanPlay("'audio/x-m4a; codecs=\"mp4a.a6\"'")); |
| EXPECT_EQ(kAc3Eac3Probably, CanPlay("'audio/x-m4a; codecs=\"mp4a.A6\"'")); |
| |
| TestMPEGUnacceptableCombinations("audio/x-m4a"); |
| } |
| |
| // When modifying this test, also change CodecSupportTest_Avc3Variants. |
| IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_Avc1Variants) { |
| // avc1 without extensions results in "maybe" for compatibility. |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1\"'")); |
| |
| // Any 6-digit hexadecimal number will result in at least "maybe". |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.123456\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.ABCDEF\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.abcdef\"'")); |
| EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc1.12345\"'")); |
| EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc1.1234567\"'")); |
| |
| // Both upper and lower case hexadecimal digits are accepted. |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E01E\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42e01e\"'")); |
| |
| // From a YouTube DASH MSE test manifest. |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.4d401f\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.4d401e\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.4d4015\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.640028\"'")); |
| |
| // |
| // Baseline Profile (66 == 0x42). |
| // The first two digits must be 42. The third digit (constraint_set_flags) |
| // must be valid hex but it otherwise is ignored. The fourth digit (reserved) |
| // must be 0. The last two digits must be any valid level. |
| // |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42001E\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42401E\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42801E\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E00A\"'")); |
| EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc1.42G01E\"'")); |
| |
| // The fourth digit must be 0. |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E11E\"'")); |
| |
| // |
| // Main Profile (77 == 0x4D). |
| // The first two digits must be 4D. The third digit (constraint_set_flags) |
| // must be valid hex but it otherwise is ignored. The fourth digit (reserved) |
| // must be 0. The last two digits must be any valid level. |
| // |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.4D001E\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.4D400A\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.4D800A\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.4DE00A\"'")); |
| EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc1.4DG01E\"'")); |
| |
| // The fourth digit must be 0. |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.4DE11E\"'")); |
| |
| // |
| // High Profile (100 == 0x64). |
| // The first two digits must be 64. The third digit (constraint_set_flags) |
| // must be valid hex but it otherwise is ignored. The fourth digit (reserved) |
| // must be 0. The last two digits must be any valid level. |
| // |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.64001E\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.64400A\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.64800A\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.64E00A\"'")); |
| EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc1.64G01E\"'")); |
| |
| // The fourth digit must be 0. |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.64E11E\"'")); |
| |
| // |
| // Other profiles are not known to be supported. |
| // |
| |
| // Extended Profile (88 == 0x58). |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.58A01E\"'")); |
| } |
| |
| // When modifying this test, also change CodecSupportTest_Avc1Variants. |
| IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_Avc3Variants) { |
| // avc3 without extensions results in "maybe" for compatibility. |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc3\"'")); |
| |
| // Any 6-digit hexadecimal number will result in at least "maybe". |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc3.123456\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc3.ABCDEF\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc3.abcdef\"'")); |
| EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc3.12345\"'")); |
| EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc3.1234567\"'")); |
| |
| // Both upper and lower case hexadecimal digits are accepted. |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.42E01E\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.42e01e\"'")); |
| |
| // From a YouTube DASH MSE test manifest. |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.4d401f\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.4d401e\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.4d4015\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.640028\"'")); |
| |
| // |
| // Baseline Profile (66 == 0x42). |
| // The first two digits must be 42. The third digit (constraint_set_flags) |
| // must be valid hex but it otherwise is ignored. The fourth digit (reserved) |
| // must be 0. The last two digits must be any valid level. |
| // |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.42001E\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.42400A\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.42800A\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.42E00A\"'")); |
| EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc3.42G01E\"'")); |
| |
| // The fourth digit must be 0. |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc3.42E11E\"'")); |
| |
| // |
| // Main Profile (77 == 0x4D). |
| // The first two digits must be 4D. The third digit (constraint_set_flags) |
| // must be valid hex but it otherwise is ignored. The fourth digit (reserved) |
| // must be 0. The last two digits must be any valid level. |
| // |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.4D001E\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.4D400A\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.4D800A\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.4DE00A\"'")); |
| EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc3.4DG01E\"'")); |
| |
| // The fourth digit must be 0. |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc3.4DE11E\"'")); |
| |
| // |
| // High Profile (100 == 0x64). |
| // The first two digits must be 64. The third digit (constraint_set_flags) |
| // must be valid hex but it otherwise is ignored. The fourth digit (reserved) |
| // must be 0. The last two digits must be any valid level. |
| // |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.64001E\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.64400A\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.64800A\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc3.64E00A\"'")); |
| EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"avc3.64G01E\"'")); |
| |
| // The fourth digit must be 0. |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc3.64E11E\"'")); |
| |
| // |
| // Other profiles are not known to be supported. |
| // |
| |
| // Extended Profile (88 == 0x58). |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc3.58A01E\"'")); |
| } |
| |
| // Tests AVC levels using AVC1 Baseline (0x42E0zz). |
| // Other supported values for the first four hexadecimal digits should behave |
| // the same way but are not tested. |
| // For each full level, the following are tested: |
| // * The hexadecimal value before it is not supported. |
| // * The hexadecimal value for the main level and all sub-levels are supported. |
| // * The hexadecimal value after the last sub-level it is not supported. |
| // * Decimal representations of the levels are not supported. |
| |
| IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_AvcLevels) { |
| // Level 0 is not supported. |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E000\"'")); |
| |
| // Levels 1 (0x0A), 1.1 (0x0B), 1.2 (0x0C), 1.3 (0x0D). |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E009\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E00A\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E00B\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E00C\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E00D\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E00E\"'")); |
| // Verify that decimal representations of levels are not supported. |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E001\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E010\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E011\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E012\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E013\"'")); |
| |
| // Levels 2 (0x14), 2.1 (0x15), 2.2 (0x16) |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E013\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E014\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E015\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E016\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E017\"'")); |
| // Verify that decimal representations of levels are not supported. |
| // However, 20 is level 3.2. |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E002\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E020\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E021\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E022\"'")); |
| |
| // Levels 3 (0x1e), 3.1 (0x1F), 3.2 (0x20) |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E01D\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E01E\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E01F\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E020\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E021\"'")); |
| // Verify that decimal representations of levels are not supported. |
| // However, 32 is level 5. |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E003\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E030\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E031\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E032\"'")); |
| |
| // Levels 4 (0x28), 4.1 (0x29), 4.2 (0x2A) |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E027\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E028\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E029\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E02A\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E02B\"'")); |
| // Verify that decimal representations of levels are not supported. |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E004\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E040\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E041\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E042\"'")); |
| |
| // Levels 5 (0x32), 5.1 (0x33). |
| // Note: Level 5.2 (0x34) is not considered valid (crbug.com/460376). |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E031\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E032\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"avc1.42E033\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E034\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E035\"'")); |
| // Verify that decimal representations of levels are not supported. |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E005\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E050\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E051\"'")); |
| EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E052\"'")); |
| } |
| |
| // TODO(servolk): Add extensive tests for various HEVC profiles, levels and |
| // tiers, similar to avc1/avc3 tests above, after proper HEVC codec id parsing |
| // is implemented (crbug.com/482761) |
| |
| // All values that return positive results are tested. There are also |
| // negative tests for values around or that could potentially be confused with |
| // (e.g. case, truncation, hex <-> deciemal conversion) those values that return |
| // positive results. |
| IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_Mp4aVariants) { |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.6\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.60\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.61\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.62\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.63\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.65\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.65\"'")); |
| // MPEG2 AAC Main, LC, and SSR are supported except on Android. |
| EXPECT_EQ(kMpeg2AacProbably, CanPlay("'audio/mp4; codecs=\"mp4a.66\"'")); |
| EXPECT_EQ(kMpeg2AacProbably, CanPlay("'audio/mp4; codecs=\"mp4a.67\"'")); |
| EXPECT_EQ(kMpeg2AacProbably, CanPlay("'audio/mp4; codecs=\"mp4a.68\"'")); |
| // MP3. |
| EXPECT_EQ(kPropProbably, CanPlay("'audio/mp4; codecs=\"mp4a.69\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.6A\"'")); |
| // MP3. |
| EXPECT_EQ(kPropProbably, CanPlay("'audio/mp4; codecs=\"mp4a.6B\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.6b\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.6C\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.6D\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.6E\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.6F\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.76\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.4\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.39\"'")); |
| |
| // mp4a.40 without further extension is ambiguous and results in "maybe". |
| EXPECT_EQ(kPropMaybe, CanPlay("'audio/mp4; codecs=\"mp4a.40\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.0\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.1\"'")); |
| // MPEG4 AAC LC. |
| EXPECT_EQ(kPropProbably, CanPlay("'audio/mp4; codecs=\"mp4a.40.2\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.3\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.4\"'")); |
| // MPEG4 AAC SBR v1. |
| EXPECT_EQ(kPropProbably, CanPlay("'audio/mp4; codecs=\"mp4a.40.5\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.6\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.7\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.8\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.9\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.10\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.20\"'")); |
| // MPEG4 AAC SBR PS v2. |
| EXPECT_EQ(kPropProbably, CanPlay("'audio/mp4; codecs=\"mp4a.40.29\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.30\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.40\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.50\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.290\"'")); |
| // Check conversions of decimal 29 to hex and hex 29 to decimal. |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.1d\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.1D\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.41\"'")); |
| |
| // Allow leading zeros in aud-oti for specific MPEG4 AAC strings. |
| // See http://crbug.com/440607. |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.00\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.01\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'audio/mp4; codecs=\"mp4a.40.02\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.03\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.04\"'")); |
| EXPECT_EQ(kPropProbably, CanPlay("'audio/mp4; codecs=\"mp4a.40.05\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.40.029\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.41\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.41.2\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.4.2\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.400.2\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.040.2\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.4.5\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.400.5\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/mp4; codecs=\"mp4a.040.5\"'")); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_HLS) { |
| // HLS are supported only on Android IceCreamSandwich and above (API level 14) |
| std::string probablyCanPlayHLS = kNot; |
| std::string maybeCanPlayHLS = kNot; |
| #if defined(OS_ANDROID) |
| if (base::android::BuildInfo::GetInstance()->sdk_int() > 13) { |
| probablyCanPlayHLS = kProbably; |
| maybeCanPlayHLS = kMaybe; |
| } |
| #endif |
| EXPECT_EQ(maybeCanPlayHLS, CanPlay("'application/x-mpegurl'")); |
| |
| EXPECT_EQ(maybeCanPlayHLS, |
| CanPlay("'application/x-mpegurl; codecs=\"avc1\"'")); |
| EXPECT_EQ(maybeCanPlayHLS, |
| CanPlay("'application/x-mpegurl; codecs=\"avc3\"'")); |
| EXPECT_EQ(maybeCanPlayHLS, |
| CanPlay("'application/x-mpegurl; codecs=\"mp4a.40\"'")); |
| EXPECT_EQ(maybeCanPlayHLS, |
| CanPlay("'application/x-mpegurl; codecs=\"avc1, mp4a.40\"'")); |
| EXPECT_EQ(maybeCanPlayHLS, |
| CanPlay("'application/x-mpegurl; codecs=\"avc3, mp4a.40\"'")); |
| |
| EXPECT_EQ(probablyCanPlayHLS, |
| CanPlay("'application/x-mpegurl; codecs=\"avc1.42E01E\"'")); |
| EXPECT_EQ(probablyCanPlayHLS, |
| CanPlay("'application/x-mpegurl; codecs=\"avc3.42E01E\"'")); |
| EXPECT_EQ(probablyCanPlayHLS, |
| CanPlay("'application/x-mpegurl; codecs=\"avc3.42801E\"'")); |
| EXPECT_EQ(probablyCanPlayHLS, |
| CanPlay("'application/x-mpegurl; codecs=\"avc3.42C01E\"'")); |
| |
| EXPECT_EQ(maybeCanPlayHLS, |
| CanPlay("'application/x-mpegurl; codecs=\"avc1.42E11E\"'")); |
| EXPECT_EQ(probablyCanPlayHLS, |
| CanPlay("'application/x-mpegurl; codecs=\"avc1.42101E\"'")); |
| EXPECT_EQ(probablyCanPlayHLS, |
| CanPlay("'application/x-mpegurl; codecs=\"avc1.42701E\"'")); |
| EXPECT_EQ(probablyCanPlayHLS, |
| CanPlay("'application/x-mpegurl; codecs=\"avc1.42F01E\"'")); |
| |
| EXPECT_EQ(probablyCanPlayHLS, |
| CanPlay("'application/x-mpegurl; codecs=\"mp4a.40.2\"'")); |
| EXPECT_EQ(probablyCanPlayHLS, |
| CanPlay("'application/x-mpegurl; codecs=\"mp4a.40.02\"'")); |
| EXPECT_EQ(probablyCanPlayHLS, |
| CanPlay("'application/x-mpegurl; codecs=\"avc1.42E01E, mp4a.40.2\"'")); |
| EXPECT_EQ(probablyCanPlayHLS, |
| CanPlay("'application/x-mpegurl; codecs=\"avc1.42E01E, mp4a.40.02\"'")); |
| EXPECT_EQ(probablyCanPlayHLS, |
| CanPlay("'application/x-mpegurl; codecs=\"avc3.42E01E, mp4a.40.5\"'")); |
| EXPECT_EQ(probablyCanPlayHLS, |
| CanPlay("'application/x-mpegurl; codecs=\"avc3.42E01E, mp4a.40.05\"'")); |
| EXPECT_EQ(probablyCanPlayHLS, |
| CanPlay("'application/x-mpegurl; codecs=\"avc3.42E01E, mp4a.40.29\"'")); |
| |
| EXPECT_EQ(kNot, |
| CanPlay("'application/x-mpegurl; codecs=\"hev1.1.6.L93.B0\"'")); |
| EXPECT_EQ(kNot, |
| CanPlay("'application/x-mpegurl; codecs=\"hvc1.1.6.L93.B0\"'")); |
| EXPECT_EQ(kNot, |
| CanPlay("'application/x-mpegurl; codecs=\"hev1.1.6.L93.B0,mp4a.40.5\"'")); |
| EXPECT_EQ(kNot, |
| CanPlay("'application/x-mpegurl; codecs=\"hvc1.1.6.L93.B0,mp4a.40.5\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'application/x-mpegurl; codecs=\"ac-3\"'")); |
| EXPECT_EQ(kNot, CanPlay("'application/x-mpegurl; codecs=\"ec-3\"'")); |
| EXPECT_EQ(kNot, CanPlay("'application/x-mpegurl; codecs=\"mp4a.A5\"'")); |
| EXPECT_EQ(kNot, CanPlay("'application/x-mpegurl; codecs=\"mp4a.A6\"'")); |
| EXPECT_EQ(kNot, CanPlay("'application/x-mpegurl; codecs=\"mp4a.a5\"'")); |
| EXPECT_EQ(kNot, CanPlay("'application/x-mpegurl; codecs=\"mp4a.a6\"'")); |
| |
| EXPECT_EQ(maybeCanPlayHLS, |
| CanPlay("'application/x-mpegurl; codecs=\"avc1, mp4a.40.2\"'")); |
| EXPECT_EQ(maybeCanPlayHLS, |
| CanPlay("'application/x-mpegurl; codecs=\"avc1, mp4a.40.02\"'")); |
| EXPECT_EQ(maybeCanPlayHLS, |
| CanPlay("'application/x-mpegurl; codecs=\"avc3, mp4a.40.2\"'")); |
| EXPECT_EQ(maybeCanPlayHLS, |
| CanPlay("'application/x-mpegurl; codecs=\"avc3, mp4a.40.02\"'")); |
| EXPECT_EQ(maybeCanPlayHLS, |
| CanPlay("'application/x-mpegurl; codecs=\"avc1.42E01E, mp4a.40\"'")); |
| EXPECT_EQ(maybeCanPlayHLS, |
| CanPlay("'application/x-mpegurl; codecs=\"avc3.42E01E, mp4a.40\"'")); |
| |
| TestMPEGUnacceptableCombinations("application/x-mpegurl"); |
| |
| EXPECT_EQ(maybeCanPlayHLS, CanPlay("'application/vnd.apple.mpegurl'")); |
| |
| EXPECT_EQ(maybeCanPlayHLS, |
| CanPlay("'application/vnd.apple.mpegurl; codecs=\"avc1\"'")); |
| EXPECT_EQ(maybeCanPlayHLS, |
| CanPlay("'application/vnd.apple.mpegurl; codecs=\"avc3\"'")); |
| EXPECT_EQ(maybeCanPlayHLS, |
| CanPlay("'application/vnd.apple.mpegurl; codecs=\"mp4a.40\"'")); |
| EXPECT_EQ(maybeCanPlayHLS, |
| CanPlay("'application/vnd.apple.mpegurl; codecs=\"avc1, mp4a.40\"'")); |
| EXPECT_EQ(maybeCanPlayHLS, |
| CanPlay("'application/vnd.apple.mpegurl; codecs=\"avc3, mp4a.40\"'")); |
| |
| EXPECT_EQ(probablyCanPlayHLS, |
| CanPlay("'application/vnd.apple.mpegurl; codecs=\"avc1.42E01E\"'")); |
| EXPECT_EQ(probablyCanPlayHLS, |
| CanPlay("'application/vnd.apple.mpegurl; codecs=\"avc3.42E01E\"'")); |
| EXPECT_EQ(probablyCanPlayHLS, |
| CanPlay("'application/vnd.apple.mpegurl; codecs=\"avc3.42801E\"'")); |
| EXPECT_EQ(probablyCanPlayHLS, |
| CanPlay("'application/vnd.apple.mpegurl; codecs=\"avc3.42C01E\"'")); |
| |
| EXPECT_EQ(maybeCanPlayHLS, |
| CanPlay("'application/vnd.apple.mpegurl; codecs=\"avc1.42E11E\"'")); |
| EXPECT_EQ(probablyCanPlayHLS, |
| CanPlay("'application/vnd.apple.mpegurl; codecs=\"avc1.42101E\"'")); |
| EXPECT_EQ(probablyCanPlayHLS, |
| CanPlay("'application/vnd.apple.mpegurl; codecs=\"avc1.42701E\"'")); |
| EXPECT_EQ(probablyCanPlayHLS, |
| CanPlay("'application/vnd.apple.mpegurl; codecs=\"avc1.42F01E\"'")); |
| |
| EXPECT_EQ(probablyCanPlayHLS, |
| CanPlay("'application/vnd.apple.mpegurl; codecs=\"mp4a.40.2\"'")); |
| EXPECT_EQ(probablyCanPlayHLS, |
| CanPlay("'application/vnd.apple.mpegurl; codecs=\"mp4a.40.02\"'")); |
| EXPECT_EQ(probablyCanPlayHLS, |
| CanPlay("'application/vnd.apple.mpegurl; codecs=\"mp4a.40.5\"'")); |
| EXPECT_EQ(probablyCanPlayHLS, |
| CanPlay("'application/vnd.apple.mpegurl; codecs=\"mp4a.40.05\"'")); |
| EXPECT_EQ(probablyCanPlayHLS, |
| CanPlay("'application/vnd.apple.mpegurl; codecs=\"mp4a.40.29\"'")); |
| |
| EXPECT_EQ(maybeCanPlayHLS, |
| CanPlay("'application/vnd.apple.mpegurl; codecs=\"avc1, mp4a.40.2\"'")); |
| EXPECT_EQ(maybeCanPlayHLS, |
| CanPlay("'application/vnd.apple.mpegurl; codecs=\"avc1, mp4a.40.02\"'")); |
| EXPECT_EQ(maybeCanPlayHLS, |
| CanPlay("'application/vnd.apple.mpegurl; codecs=\"avc3, mp4a.40.2\"'")); |
| EXPECT_EQ(maybeCanPlayHLS, |
| CanPlay("'application/vnd.apple.mpegurl; codecs=\"avc3, mp4a.40.02\"'")); |
| EXPECT_EQ(maybeCanPlayHLS, |
| CanPlay("'application/vnd.apple.mpegurl; " |
| "codecs=\"avc1.42E01E, mp4a.40\"'")); |
| EXPECT_EQ(maybeCanPlayHLS, |
| CanPlay("'application/vnd.apple.mpegurl; " |
| "codecs=\"avc3.42E01E, mp4a.40\"'")); |
| |
| EXPECT_EQ(kNot, |
| CanPlay("'application/vnd.apple.mpegurl; codecs=\"hev1.1.6.L93.B0\"'")); |
| EXPECT_EQ(kNot, |
| CanPlay("'application/vnd.apple.mpegurl; codecs=\"hvc1.1.6.L93.B0\"'")); |
| EXPECT_EQ(kNot, |
| CanPlay("'application/vnd.apple.mpegurl; " |
| "codecs=\"hev1.1.6.L93.B0,mp4a.40.5\"'")); |
| EXPECT_EQ(kNot, |
| CanPlay("'application/vnd.apple.mpegurl; " |
| "codecs=\"hvc1.1.6.L93.B0,mp4a.40.5\"'")); |
| |
| EXPECT_EQ(kNot, CanPlay("'application/vnd.apple.mpegurl; codecs=\"ac-3\"'")); |
| EXPECT_EQ(kNot, CanPlay("'application/vnd.apple.mpegurl; codecs=\"ec-3\"'")); |
| EXPECT_EQ(kNot, |
| CanPlay("'application/vnd.apple.mpegurl; codecs=\"mp4a.A5\"'")); |
| EXPECT_EQ(kNot, |
| CanPlay("'application/vnd.apple.mpegurl; codecs=\"mp4a.A6\"'")); |
| EXPECT_EQ(kNot, |
| CanPlay("'application/vnd.apple.mpegurl; codecs=\"mp4a.a5\"'")); |
| EXPECT_EQ(kNot, |
| CanPlay("'application/vnd.apple.mpegurl; codecs=\"mp4a.a6\"'")); |
| |
| TestMPEGUnacceptableCombinations("application/vnd.apple.mpegurl"); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_AAC_ADTS) { |
| EXPECT_EQ(kPropProbably, CanPlay("'audio/aac'")); |
| |
| // audio/aac doesn't support the codecs parameter. |
| EXPECT_EQ(kNot, CanPlay("'audio/aac; codecs=\"1\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/aac; codecs=\"aac\"'")); |
| EXPECT_EQ(kNot, CanPlay("'audio/aac; codecs=\"mp4a.40.2\"'")); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_Mpeg2Ts) { |
| EXPECT_EQ(kMp2tsMaybe, CanPlay("'video/mp2t'")); |
| |
| // video/mp2t must support standard RFC 6381 compliant H.264 / AAC codec ids. |
| // H.264 baseline, main, high profiles |
| EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.42E01E\"'")); |
| EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.4D401E\"'")); |
| EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.640028\"'")); |
| // AAC LC audio |
| EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"mp4a.40.2\"'")); |
| // H.264 + AAC audio combinations |
| EXPECT_EQ(kMp2tsProbably, |
| CanPlay("'video/mp2t; codecs=\"avc1.42E01E,mp4a.40.2\"'")); |
| EXPECT_EQ(kMp2tsProbably, |
| CanPlay("'video/mp2t; codecs=\"avc1.4D401E,mp4a.40.2\"'")); |
| EXPECT_EQ(kMp2tsProbably, |
| CanPlay("'video/mp2t; codecs=\"avc1.640028,mp4a.40.2\"'")); |
| // H.264 + AC3/EAC3 audio combinations |
| EXPECT_EQ(kMp2tsAc3Eac3Probably, |
| CanPlay("'video/mp2t; codecs=\"avc1.640028,ac-3\"'")); |
| EXPECT_EQ(kMp2tsAc3Eac3Probably, |
| CanPlay("'video/mp2t; codecs=\"avc1.640028,ec-3\"'")); |
| EXPECT_EQ(kMp2tsAc3Eac3Probably, |
| CanPlay("'video/mp2t; codecs=\"avc1.640028,mp4a.A5\"'")); |
| EXPECT_EQ(kMp2tsAc3Eac3Probably, |
| CanPlay("'video/mp2t; codecs=\"avc1.640028,mp4a.A6\"'")); |
| EXPECT_EQ(kMp2tsAc3Eac3Probably, |
| CanPlay("'video/mp2t; codecs=\"avc1.640028,mp4a.a5\"'")); |
| EXPECT_EQ(kMp2tsAc3Eac3Probably, |
| CanPlay("'video/mp2t; codecs=\"avc1.640028,mp4a.a6\"'")); |
| |
| TestMPEGUnacceptableCombinations("video/mp2t"); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, |
| CodecSupportTest_Mpeg2Ts_LegacyAvc1_codec_ids) { |
| // Old-style avc1/H.264 codec ids that are still being used by some HLS |
| // streaming apps for backward compatibility. |
| // H.264 baseline profile |
| EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.66.10\"'")); |
| EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.66.13\"'")); |
| EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.66.20\"'")); |
| EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.66.22\"'")); |
| EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.66.30\"'")); |
| EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.66.32\"'")); |
| EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.66.40\"'")); |
| EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.66.42\"'")); |
| // H.264 main profile |
| EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.77.10\"'")); |
| EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.77.13\"'")); |
| EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.77.20\"'")); |
| EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.77.22\"'")); |
| EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.77.30\"'")); |
| EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.77.32\"'")); |
| EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.77.40\"'")); |
| EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.77.42\"'")); |
| // H.264 high profile |
| EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.100.10\"'")); |
| EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.100.13\"'")); |
| EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.100.20\"'")); |
| EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.100.22\"'")); |
| EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.100.30\"'")); |
| EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.100.32\"'")); |
| EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.100.40\"'")); |
| EXPECT_EQ(kMp2tsProbably, CanPlay("'video/mp2t; codecs=\"avc1.100.42\"'")); |
| |
| // H.264 + AAC audio combinations |
| EXPECT_EQ(kMp2tsProbably, |
| CanPlay("'video/mp2t; codecs=\"avc1.66.10,mp4a.40.2\"'")); |
| EXPECT_EQ(kMp2tsProbably, |
| CanPlay("'video/mp2t; codecs=\"avc1.66.30,mp4a.40.2\"'")); |
| EXPECT_EQ(kMp2tsProbably, |
| CanPlay("'video/mp2t; codecs=\"avc1.77.10,mp4a.40.2\"'")); |
| EXPECT_EQ(kMp2tsProbably, |
| CanPlay("'video/mp2t; codecs=\"avc1.77.30,mp4a.40.2\"'")); |
| EXPECT_EQ(kMp2tsProbably, |
| CanPlay("'video/mp2t; codecs=\"avc1.100.40,mp4a.40.2\"'")); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_Mpeg2TsAudio) { |
| // audio/mp2t is currently not supported (see also crbug.com/556837). |
| EXPECT_EQ(kNot, CanPlay("'audio/mp2t; codecs=\"mp4a.40.2\"'")); |
| } |
| |
| } // namespace content |