Skip to content

Commit

Permalink
Reland of Implement support for vp9 in ISO-BMFF (patchset crosswalk-p…
Browse files Browse the repository at this point in the history
…roject#1 id:1 of https://codereview.chromium.org/1899423002/ )

Reason for revert:
My suspicion was wrong. The reverted CL was not the culprit.

Original issue's description:
> Revert of Implement support for vp9 in ISO-BMFF (patchset crosswalk-project#15 id:280001 of https://codereview.chromium.org/1624703002/ )
>
> Reason for revert:
> Suspect for perf regression: increased the number of static initializers (in stream_parser_factory.cc).
>
> https://build.chromium.org/p/chromium/builders/Mac/builds/14593
> https://build.chromium.org/p/chromium/builders/Linux%20x64/builds/18412
>
> See crbug.com/605017 for more details.
>
> Original issue's description:
> > Implement support for vp9 in ISO-BMFF
> >
> > The feature is implemented under flag ENABLE_MP4_VP9_DEMUXING, off for now.
> >
> > BUG=580623
>
> [email protected],[email protected],[email protected],[email protected],[email protected]
> # Skipping CQ checks because original CL landed less than 1 days ago.
> NOPRESUBMIT=true
> NOTREECHECKS=true
> NOTRY=true
> BUG=580623,605017

[email protected],[email protected],[email protected],[email protected],[email protected]
# Skipping CQ checks because original CL landed less than 1 days ago.
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=580623,605017

Review URL: https://codereview.chromium.org/1897363004

Cr-Commit-Position: refs/heads/master@{#388442}
  • Loading branch information
msramek authored and Commit bot committed Apr 20, 2016
1 parent 92c2406 commit 12b5059
Show file tree
Hide file tree
Showing 20 changed files with 366 additions and 70 deletions.
1 change: 1 addition & 0 deletions chrome/browser/media/DEPS
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ include_rules = [
"+media/audio",
"+media/base",
"+media/cast",
"+media/media_features.h",
"+third_party/libyuv",
"+third_party/webrtc",
]
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include "content/public/common/content_switches.h"
#include "content/public/test/browser_test_utils.h"
#include "media/base/test_data_util.h"
#include "media/media_features.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "url/gurl.h"

Expand Down Expand Up @@ -114,6 +115,10 @@ class EncryptedMediaSupportedTypesTest : public InProcessBrowserTest {
video_mp4_codecs_.push_back("avc1.4D000C"); // Main profile.
video_mp4_codecs_.push_back("avc3.64001F"); // High profile.

#if BUILDFLAG(ENABLE_MP4_VP9_DEMUXING)
video_mp4_codecs_.push_back("vp09.01.01.08.02.01.01.00");
#endif

video_mp4_hi10p_codecs_.push_back("avc1.6E001E"); // Hi10P profile

// Extended codecs are used, so make sure generic ones fail. These will be
Expand Down
1 change: 1 addition & 0 deletions chrome/renderer/media/DEPS
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@ include_rules = [
"+media/video", # For basic video functions.
"+media/base", # For basic media functions.
"+media/cast", # For cast streaming library.
"+media/media_features.h", # For flag definitions.
]
5 changes: 5 additions & 0 deletions chrome/renderer/media/chrome_key_systems.cc
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include "components/cdm/renderer/widevine_key_systems.h"
#include "content/public/renderer/render_thread.h"
#include "media/base/eme_constants.h"
#include "media/media_features.h"

#if defined(OS_ANDROID)
#include "components/cdm/renderer/android_key_systems.h"
Expand Down Expand Up @@ -190,6 +191,10 @@ static void AddPepperBasedWidevine(
#if defined(USE_PROPRIETARY_CODECS)
if (codecs[i] == kCdmSupportedCodecAvc1)
supported_codecs |= media::EME_CODEC_MP4_AVC1;
#if BUILDFLAG(ENABLE_MP4_VP9_DEMUXING)
if (codecs[i] == kCdmSupportedCodecVp9)
supported_codecs |= media::EME_CODEC_MP4_VP9;
#endif
#endif // defined(USE_PROPRIETARY_CODECS)
}

Expand Down
81 changes: 81 additions & 0 deletions content/browser/media/media_canplaytype_browsertest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,14 @@ const char* kHi10pProbably = kPropProbably;
const char* kHi10pProbably = kPropMaybe;
#endif

#if BUILDFLAG(ENABLE_MP4_VP9_DEMUXING)
const char* kMp4Vp9Probably = kPropProbably;
const char* kMP4Vp9Maybe = kMaybe;
#else
const char* kMp4Vp9Probably = kNot;
const char* kMP4Vp9Maybe = kNot;
#endif

namespace content {

class MediaCanPlayTypeTest : public MediaBrowserTest {
Expand Down Expand Up @@ -220,6 +228,12 @@ class MediaCanPlayTypeTest : public MediaBrowserTest {

EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp8\"'"));
EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp9\"'"));
EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp8.0\"'"));
EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp9.0\"'"));
EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp08\"'"));
EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp09\"'"));
EXPECT_EQ(kNot,
CanPlay("'" + mime + "; codecs=\"vp08.00.01.08.02.01.01.00\"'"));
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\"'"));
Expand Down Expand Up @@ -332,11 +346,17 @@ class MediaCanPlayTypeTest : public MediaBrowserTest {
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=\"vp08\"'"));
EXPECT_EQ(kNot,
CanPlay("'" + mime + "; codecs=\"vp08.00.01.08.02.01.01.00\"'"));

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=\"vp09\"'"));
EXPECT_EQ(kNot,
CanPlay("'" + mime + "; codecs=\"vp09.00.01.08.02.01.01.00\"'"));

EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc1\"'"));
EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"avc3\"'"));
Expand Down Expand Up @@ -392,6 +412,12 @@ class MediaCanPlayTypeTest : public MediaBrowserTest {
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=\"vp08\"'"));
EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp09\"'"));
EXPECT_EQ(kNot,
CanPlay("'" + mime + "; codecs=\"vp08.00.01.08.02.01.01.00\"'"));
EXPECT_EQ(kNot,
CanPlay("'" + mime + "; codecs=\"vp09.00.01.08.02.01.01.00\"'"));

EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"theora\"'"));
EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"theora, vorbis\"'"));
Expand Down Expand Up @@ -451,6 +477,12 @@ class MediaCanPlayTypeTest : public MediaBrowserTest {
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=\"vp08\"'"));
EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vp09\"'"));
EXPECT_EQ(kNot,
CanPlay("'" + mime + "; codecs=\"vp08.00.01.08.02.01.01.00\"'"));
EXPECT_EQ(kNot,
CanPlay("'" + mime + "; codecs=\"vp09.00.01.08.02.01.01.00\"'"));

EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"vorbis\"'"));
EXPECT_EQ(kNot, CanPlay("'" + mime + "; codecs=\"opus\"'"));
Expand Down Expand Up @@ -741,6 +773,9 @@ IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_mp4) {
EXPECT_EQ(kHevcSupported,
CanPlay("'video/mp4; codecs=\"hvc1.1.6.L93.B0, mp4a.40.5\"'"));

EXPECT_EQ(kMp4Vp9Probably,
CanPlay("'video/mp4; codecs=\"vp09.00.01.08.02.01.01.00\"'"));

TestMPEGUnacceptableCombinations("video/mp4");
// This result is incorrect. See https://crbug.com/592889.
EXPECT_EQ(kPropProbably, CanPlay("'video/mp4; codecs=\"mp3\"'"));
Expand Down Expand Up @@ -798,6 +833,9 @@ IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_mp4) {
EXPECT_EQ(kNot,
CanPlay("'video/x-m4v; codecs=\"hvc1.1.6.L93.B0, mp4a.40.5\"'"));

EXPECT_EQ(kNot,
CanPlay("'video/x-m4v; codecs=\"vp09.00.01.08.02.01.01.00\"'"));

EXPECT_EQ(kNot, CanPlay("'video/x-m4v; codecs=\"ac-3\"'"));
EXPECT_EQ(kNot, CanPlay("'video/x-m4v; codecs=\"mp4a.a5\"'"));
EXPECT_EQ(kNot, CanPlay("'video/x-m4v; codecs=\"mp4a.A5\"'"));
Expand Down Expand Up @@ -840,6 +878,8 @@ IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_mp4) {
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(kNot, CanPlay("'audio/mp4; codecs=\"vp09.00.01.08.02.01.01.00\"'"));

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\"'"));
Expand Down Expand Up @@ -881,6 +921,9 @@ IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_mp4) {
EXPECT_EQ(kNot,
CanPlay("'audio/x-m4a; codecs=\"hvc1.1.6.L93.B0, mp4a.40.5\"'"));

EXPECT_EQ(kNot,
CanPlay("'audio/x-m4a; codecs=\"vp09.00.01.08.02.01.01.00\"'"));

EXPECT_EQ(kNot, CanPlay("'audio/x-m4a; codecs=\"ac-3\"'"));
EXPECT_EQ(kNot, CanPlay("'audio/x-m4a; codecs=\"mp4a.a5\"'"));
EXPECT_EQ(kNot, CanPlay("'audio/x-m4a; codecs=\"mp4a.A5\"'"));
Expand Down Expand Up @@ -1178,6 +1221,37 @@ IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_AvcLevels) {
EXPECT_EQ(kPropMaybe, CanPlay("'video/mp4; codecs=\"avc1.42E052\"'"));
}

IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_Mp4Vp9Variants) {
// Malformed codecs string.
EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"vp09.00.-1.08\"'"));

// Codecs strings with missing fields.
EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"vp09\"'"));
EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"vp09.00.01.08\"'"));
EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"vp09.01.01..02.01.01.00\"'"));
EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"vp09.01.01.08.05.01.01\"'"));
EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"vp09.04\"'"));

// Unexpected bit depth.
EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"vp09.01.01.09.02.01.01.00\"'"));
// Unexpected chroma subsampling.
EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"vp09.01.01.08.04.04.00.00\"'"));
// Unexpected transfer function.
EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"vp09.01.01.08.04.03.02.00\"'"));

EXPECT_EQ(kMp4Vp9Probably,
CanPlay("'video/mp4; codecs=\"vp09.00.01.08.02.01.01.00\"'"));
EXPECT_EQ(kMp4Vp9Probably,
CanPlay("'video/mp4; codecs=\"vp09.00.01.08.04.03.00.00\"'"));
EXPECT_EQ(kMP4Vp9Maybe,
CanPlay("'video/mp4; codecs=\"vp09.01.01.08.02.01.01.00\"'"));
EXPECT_EQ(kMP4Vp9Maybe,
CanPlay("'video/mp4; codecs=\"vp09.02.01.08.02.01.01.00\"'"));
EXPECT_EQ(kMP4Vp9Maybe,
CanPlay("'video/mp4; codecs=\"vp09.03.01.08.02.01.01.00\"'"));
EXPECT_EQ(kNot, CanPlay("'video/mp4; codecs=\"vp09.04.01.08.02.01.01.00\"'"));
}

// 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)
Expand Down Expand Up @@ -1337,6 +1411,10 @@ IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_HLS) {
EXPECT_EQ(kNot,
CanPlay("'application/x-mpegurl; codecs=\"hvc1.1.6.L93.B0,mp4a.40.5\"'"));

EXPECT_EQ(
kNot,
CanPlay("'application/x-mpegurl; codecs=\"vp09.01.01.08.04.03.00.00\"'"));

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\"'"));
Expand Down Expand Up @@ -1448,6 +1526,9 @@ IN_PROC_BROWSER_TEST_F(MediaCanPlayTypeTest, CodecSupportTest_HLS) {
CanPlay("'application/vnd.apple.mpegurl; "
"codecs=\"hvc1.1.6.L93.B0,mp4a.40.5\"'"));

EXPECT_EQ(kNot, CanPlay("'application/vnd.apple.mpegurl; "
"codecs=\"vp09.01.01.08.04.03.00.00\"'"));

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,
Expand Down
1 change: 1 addition & 0 deletions media/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ buildflag_header("media_features") {
"ENABLE_AC3_EAC3_AUDIO_DEMUXING=$enable_ac3_eac3_audio_demuxing",
"ENABLE_HEVC_DEMUXING=$enable_hevc_demuxing",
"ENABLE_MSE_MPEG2TS_STREAM_PARSER=$enable_mse_mpeg2ts_stream_parser",
"ENABLE_MP4_VP9_DEMUXING=0",
]
}

Expand Down
3 changes: 2 additions & 1 deletion media/base/eme_constants.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@ enum EmeCodec {
EME_CODEC_MP4_AAC = 1 << 4,
EME_CODEC_MP4_AUDIO_ALL = EME_CODEC_MP4_AAC,
EME_CODEC_MP4_AVC1 = 1 << 5,
EME_CODEC_MP4_VIDEO_ALL = EME_CODEC_MP4_AVC1,
EME_CODEC_MP4_VP9 = 1 << 6,
EME_CODEC_MP4_VIDEO_ALL = (EME_CODEC_MP4_AVC1 | EME_CODEC_MP4_VP9),
EME_CODEC_MP4_ALL = (EME_CODEC_MP4_AUDIO_ALL | EME_CODEC_MP4_VIDEO_ALL),
EME_CODEC_AUDIO_ALL = (EME_CODEC_WEBM_AUDIO_ALL | EME_CODEC_MP4_AUDIO_ALL),
EME_CODEC_VIDEO_ALL = (EME_CODEC_WEBM_VIDEO_ALL | EME_CODEC_MP4_VIDEO_ALL),
Expand Down
4 changes: 4 additions & 0 deletions media/base/key_systems.cc
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include "media/base/media.h"
#include "media/base/media_client.h"
#include "media/cdm/key_system_names.h"
#include "media/media_features.h"
#include "third_party/widevine/cdm/widevine_cdm_common.h"

namespace media {
Expand Down Expand Up @@ -57,6 +58,9 @@ static const NamedCodec kCodecStrings[] = {
{"vp9", EME_CODEC_WEBM_VP9}, // VP9.
{"vp9.0", EME_CODEC_WEBM_VP9}, // VP9.
#if defined(USE_PROPRIETARY_CODECS)
#if BUILDFLAG(ENABLE_MP4_VP9_DEMUXING)
{"vp09", EME_CODEC_MP4_VP9}, // VP9 in MP4.
#endif
{"mp4a", EME_CODEC_MP4_AAC}, // AAC.
{"avc1", EME_CODEC_MP4_AVC1}, // AVC1.
{"avc3", EME_CODEC_MP4_AVC1} // AVC3.
Expand Down
Loading

0 comments on commit 12b5059

Please sign in to comment.