$ git diff --patch-with-stat --summary 0fc3d1e55fc164498b0800c91069801d0c6f50cb..2cf48cb834866a87c2d83baeb89cce73b7e1d606
.abf.yml | 7 +-
arm_use_right_compiler.patch | 2 +-
chromium-40-sorenson-spark.patch | 270 +++++++++++++++++++++++
chromium-50-system-ffmpeg-3.patch | 2 +-
chromium-69-extra-media.patch | 342 +++++++++++++++++++----------
chromium-69-no-static-libstdc++.patch | 2 +-
chromium-69-wmvflvmpg.patch | 143 ++++--------
chromium-69.0.3497.81-norar.patch | 79 -------
chromium-70.0.3538.77-gcc7.patch | 36 +--
chromium-73.0.3683.75-norar.patch | 81 +++++++
chromium-74.0.3729.108-revert_values.patch | 329 +++++++++++++++++++++++++++
chromium-browser-stable.spec | 29 ++-
move-required.patch | 124 +++++++++++
not-constexpr.patch | 184 ++++++++++++++++
quic.patch | 154 +++++++++++++
trace_fix.patch | 55 +++++
16 files changed, 1514 insertions(+), 325 deletions(-)
create mode 100644 chromium-40-sorenson-spark.patch
delete mode 100644 chromium-69.0.3497.81-norar.patch
create mode 100644 chromium-73.0.3683.75-norar.patch
create mode 100644 chromium-74.0.3729.108-revert_values.patch
create mode 100644 move-required.patch
create mode 100644 not-constexpr.patch
create mode 100644 quic.patch
create mode 100644 trace_fix.patch
diff --git a/.abf.yml b/.abf.yml
index a3f8bb9..67c2cda 100644
--- a/.abf.yml
+++ b/.abf.yml
@@ -1,6 +1,5 @@
removed_sources:
- chromium-69.0.3497.100.tar.xz: 79c8fb089e8f344dce40c6495a006a172d4fc4ac
- chromium-70.0.3538.77.tar.xz: d57862224568adb6a379592431cf5ce3c5bf757a
- chromium-71.0.3578.98.tar.xz: 5de8e48fc1f277afb16a7a484dfa0360e568632c
+ chromium-72.0.3626.121.tar.xz: bff8b4a24dda164695646f930cb95d47c4fcc246
+ chromium-74.0.3729.108.tar.xz: 561b51ac98c6e8b81c1d9a14e9f544a966dc3a2f
sources:
- chromium-72.0.3626.81.tar.xz: 16836d6f211aad133d184d1d0e347f47ea024336
+ chromium-74.0.3729.131.tar.xz: d5cf7bd3d119a692819e0135070906a62b3cdc9d
diff --git a/arm_use_right_compiler.patch b/arm_use_right_compiler.patch
index 08211ef..1530258 100644
--- a/arm_use_right_compiler.patch
+++ b/arm_use_right_compiler.patch
@@ -1,7 +1,7 @@
--- chromium-54.0.2840.59/build/toolchain/linux/BUILD.gn 2016-08-25 12:19:55.634174140 +0200
+++ chromium-54.0.2840.59/build/toolchain/linux/BUILD.gn 2016-08-25 12:19:55.634174140 +0200
@@ -6,7 +6,7 @@
- import("//build/toolchain/gcc_toolchain.gni")
+ }
clang_toolchain("clang_arm") {
- toolprefix = "arm-linux-gnueabihf-"
diff --git a/chromium-40-sorenson-spark.patch b/chromium-40-sorenson-spark.patch
new file mode 100644
index 0000000..655106a
--- /dev/null
+++ b/chromium-40-sorenson-spark.patch
@@ -0,0 +1,270 @@
+diff -up chromium-62.0.3192.0/media/base/mime_util_internal.h.wmvflvmpg chromium-62.0.3192.0/media/base/mime_util_internal.h
+--- chromium-62.0.3192.0/media/base/mime_util_internal.h.wmvflvmpg 2017-08-30 15:52:00.602204610 +0200
++++ chromium-62.0.3192.0/media/base/mime_util_internal.h 2017-08-30 15:52:00.616204356 +0200
+@@ -48,7 +48,19 @@ class MEDIA_EXPORT MimeUtil {
+ MP2,
+ MPEG4_SP,
+ MPEG4_ASP,
+- LAST_CODEC = MPEG4_ASP
++ MSMPEG4v1,
++ MSMPEG4v2,
++ MSMPEG4v3,
++ WMV7,
++ WMV8,
++ WMV9,
++ VC1,
++ WMA,
++ VP6,
++ MPEG1,
++ MPEG2,
++ FLV1,
++ LAST_CODEC = FLV1
+ };
+
+ // Platform configuration structure. Controls which codecs are supported at
+diff -up chromium-51.0.2687.0/media/ffmpeg/ffmpeg_common.cc.flv1 chromium-51.0.2687.0/media/ffmpeg/ffmpeg_common.cc
+--- chromium-51.0.2687.0/media/ffmpeg/ffmpeg_common.cc.flv1 2016-03-23 18:22:20.227596097 +0100
++++ chromium-51.0.2687.0/media/ffmpeg/ffmpeg_common.cc 2016-03-23 18:22:20.245595771 +0100
+@@ -197,6 +197,28 @@
+ return kCodecVP9;
+ case AV_CODEC_ID_AV1:
+ return kCodecAV1;
++ case AV_CODEC_ID_MSMPEG4V1:
++ return kCodecMSMPEG4V1;
++ case AV_CODEC_ID_MSMPEG4V2:
++ return kCodecMSMPEG4V2;
++ case AV_CODEC_ID_MSMPEG4V3:
++ return kCodecMSMPEG4V3;
++ case AV_CODEC_ID_WMV1:
++ return kCodecWMV7;
++ case AV_CODEC_ID_WMV2:
++ return kCodecWMV8;
++ case AV_CODEC_ID_WMV3:
++ return kCodecWMV9;
++ case AV_CODEC_ID_VC1:
++ return kCodecVC1;
++ case AV_CODEC_ID_VP6:
++ return kCodecVP6;
++ case AV_CODEC_ID_MPEG1VIDEO:
++ return kCodecMPEG1;
++ case AV_CODEC_ID_MPEG2VIDEO:
++ return kCodecMPEG2;
++ case AV_CODEC_ID_FLV1:
++ return kCodecSorensonSpark;
+ default:
+ DVLOG(1) << "Unknown video CodecID: " << codec_id;
+ }
+@@ -221,6 +223,28 @@
+ return AV_CODEC_ID_VP9;
+ case kCodecAV1:
+ return AV_CODEC_ID_AV1;
++ case kCodecMSMPEG4V1:
++ return AV_CODEC_ID_MSMPEG4V1;
++ case kCodecMSMPEG4V2:
++ return AV_CODEC_ID_MSMPEG4V2;
++ case kCodecMSMPEG4V3:
++ return AV_CODEC_ID_MSMPEG4V3;
++ case kCodecWMV7:
++ return AV_CODEC_ID_WMV1;
++ case kCodecWMV8:
++ return AV_CODEC_ID_WMV2;
++ case kCodecWMV9:
++ return AV_CODEC_ID_WMV3;
++ case kCodecVC1:
++ return AV_CODEC_ID_VC1;
++ case kCodecVP6:
++ return AV_CODEC_ID_VP6;
++ case kCodecMPEG1:
++ return AV_CODEC_ID_MPEG1VIDEO;
++ case kCodecMPEG2:
++ return AV_CODEC_ID_MPEG2VIDEO;
++ case kCodecSorensonSpark:
++ return AV_CODEC_ID_FLV1;
+ default:
+ DVLOG(1) << "Unknown VideoCodec: " << video_codec;
+ }
+--- chromium-56.0.2924.10/media/remoting/proto_enum_utils.cc.bak.2 2016-12-01 23:42:15.717317808 +0100
++++ chromium-56.0.2924.10/media/remoting/proto_enum_utils.cc 2016-12-01 23:44:59.695754038 +0100
+@@ -227,6 +227,15 @@
+ CASE_RETURN_OTHER(kCodecHEVC);
+ CASE_RETURN_OTHER(kCodecDolbyVision);
+ CASE_RETURN_OTHER(kCodecAV1);
++ CASE_RETURN_OTHER(kCodecMSMPEG4V1);
++ CASE_RETURN_OTHER(kCodecMSMPEG4V2);
++ CASE_RETURN_OTHER(kCodecMSMPEG4V3);
++ CASE_RETURN_OTHER(kCodecWMV7);
++ CASE_RETURN_OTHER(kCodecWMV8);
++ CASE_RETURN_OTHER(kCodecWMV9);
++ CASE_RETURN_OTHER(kCodecVP6);
++ CASE_RETURN_OTHER(kCodecMPEG1);
++ CASE_RETURN_OTHER(kCodecSorensonSpark);
+ }
+ return base::nullopt; // Not a 'default' to ensure compile-time checks.
+ }
+@@ -247,6 +248,15 @@
+ CASE_RETURN_OTHER(kCodecHEVC);
+ CASE_RETURN_OTHER(kCodecDolbyVision);
+ CASE_RETURN_OTHER(kCodecAV1);
++ CASE_RETURN_OTHER(kCodecMSMPEG4V1);
++ CASE_RETURN_OTHER(kCodecMSMPEG4V2);
++ CASE_RETURN_OTHER(kCodecMSMPEG4V3);
++ CASE_RETURN_OTHER(kCodecWMV7);
++ CASE_RETURN_OTHER(kCodecWMV8);
++ CASE_RETURN_OTHER(kCodecWMV9);
++ CASE_RETURN_OTHER(kCodecVP6);
++ CASE_RETURN_OTHER(kCodecMPEG1);
++ CASE_RETURN_OTHER(kCodecSorensonSpark);
+ }
+ return base::nullopt; // Not a 'default' to ensure compile-time checks.
+ }
+--- chromium-56.0.2924.10/media/remoting/media_remoting_rpc.proto.bak.2 2016-12-02 02:15:05.660562641 +0100
++++ chromium-56.0.2924.10/media/remoting/media_remoting_rpc.proto 2016-12-02 02:15:48.885796867 +0100
+@@ -154,6 +154,15 @@
+ kCodecHEVC = 8;
+ kCodecDolbyVision = 9;
+ kCodecAV1 = 10;
++ kCodecMSMPEG4V1 = 11;
++ kCodecMSMPEG4V2 = 12;
++ kCodecMSMPEG4V3 = 13;
++ kCodecWMV7 = 14;
++ kCodecWMV8 = 15;
++ kCodecWMV9 = 16;
++ kCodecVP6 = 17;
++ kCodecMPEG1 = 18;
++ kCodecSorensonSpark = 19;
+ }
+
+ // Proto version of media::VideoCodecProfile.
+--- chromium-56.0.2924.10/media/base/video_codecs.h.bak 2016-12-05 00:29:39.341097040 +0100
++++ chromium-56.0.2924.10/media/base/video_codecs.h 2016-12-05 00:30:04.352645151 +0100
+@@ -31,12 +31,21 @@
+ kCodecHEVC,
+ kCodecDolbyVision,
+ kCodecAV1,
++ kCodecMSMPEG4V1,
++ kCodecMSMPEG4V2,
++ kCodecMSMPEG4V3,
++ kCodecWMV7,
++ kCodecWMV8,
++ kCodecWMV9,
++ kCodecVP6,
++ kCodecMPEG1,
++ kCodecSorensonSpark,
+ // DO NOT ADD RANDOM VIDEO CODECS!
+ //
+ // The only acceptable time to add a new codec is if there is production code
+ // that uses said codec in the same CL.
+
+- kVideoCodecMax = kCodecAV1, // Must equal the last "real" codec above.
++ kVideoCodecMax = kCodecSorensonSpark, // Must equal the last "real" codec above.
+ };
+
+ // Video codec profiles. Keep in sync with mojo::VideoCodecProfile (see
+--- chromium-56.0.2924.10/media/base/video_codecs.cc.bak 2016-11-29 21:04:19.000000000 +0100
++++ chromium-56.0.2924.10/media/base/video_codecs.cc 2016-12-05 00:32:51.625621718 +0100
+@@ -37,6 +37,24 @@
+ return "vp9";
+ case kCodecAV1:
+ return "av1";
++ case kCodecMSMPEG4V1:
++ return "msmpeg4v1";
++ case kCodecMSMPEG4V2:
++ return "msmpeg4v2";
++ case kCodecMSMPEG4V3:
++ return "msmpeg4v2";
++ case kCodecWMV7:
++ return "wmv1";
++ case kCodecWMV8:
++ return "wmv2";
++ case kCodecWMV9:
++ return "wmv3";
++ case kCodecVP6:
++ return "vp6";
++ case kCodecMPEG1:
++ return "mpeg1video";
++ case kCodecSorensonSpark:
++ return "flv1";
+ }
+ NOTREACHED();
+ return "";
+@@ -638,6 +640,28 @@
+ if (ParseDolbyVisionCodecId(codec_id, &profile, &level))
+ return kCodecDolbyVision;
+ #endif
++ if (codec_id == "msmpeg4v1")
++ return kCodecMSMPEG4V1;
++ if (codec_id == "msmpeg4v2")
++ return kCodecMSMPEG4V2;
++ if (codec_id == "msmpeg4v2")
++ return kCodecMSMPEG4V3;
++ if (codec_id == "wmv1")
++ return kCodecWMV7;
++ if (codec_id == "wmv2")
++ return kCodecWMV8;
++ if (codec_id == "wmv3")
++ return kCodecWMV9;
++ if (codec_id == "vc1")
++ return kCodecVC1;
++ if (codec_id == "vp6")
++ return kCodecVP6;
++ if (codec_id == "mpeg1video")
++ return kCodecMPEG1;
++ if (codec_id == "mpeg2video")
++ return kCodecMPEG2;
++ if (codec_id == "flv1")
++ return kCodecSorensonSpark;
+ return kUnknownVideoCodec;
+ }
+
+--- chromium-56.0.2924.21/media/filters/ffmpeg_video_decoder.cc.flv 2016-12-10 20:33:18.005427356 +0100
++++ chromium-56.0.2924.21/media/filters/ffmpeg_video_decoder.cc 2016-12-10 20:34:28.610202853 +0100
+@@ -46,6 +46,15 @@
+
+ case kCodecTheora:
+ case kCodecMPEG4:
++ case kCodecMSMPEG4V1:
++ case kCodecMSMPEG4V2:
++ case kCodecMSMPEG4V3:
++ case kCodecWMV7:
++ case kCodecWMV8:
++ case kCodecWMV9:
++ case kCodecVP6:
++ case kCodecMPEG1:
++ case kCodecSorensonSpark:
+ // No extra threads for these codecs.
+ break;
+
+--- chromium-73.0.3683.75/media/base/supported_types.cc.flv 2019-03-17 18:44:45.934825471 +0100
++++ chromium-73.0.3683.75/media/base/supported_types.cc 2019-03-17 18:44:50.562746764 +0100
+@@ -217,6 +217,15 @@ bool IsVideoCodecProprietary(VideoCodec
+ case kCodecMPEG4:
+ case kCodecHEVC:
+ case kCodecDolbyVision:
++ case kCodecMSMPEG4V1:
++ case kCodecMSMPEG4V2:
++ case kCodecMSMPEG4V3:
++ case kCodecWMV7:
++ case kCodecWMV8:
++ case kCodecWMV9:
++ case kCodecVP6:
++ case kCodecMPEG1:
++ case kCodecSorensonSpark:
+ return true;
+ case kUnknownVideoCodec:
+ case kCodecTheora:
+@@ -264,6 +263,15 @@ bool IsDefaultSupportedVideoType(const V
+ case media::kCodecVC1:
+ case media::kCodecMPEG2:
+ case media::kCodecHEVC:
++ case media::kCodecMSMPEG4V1:
++ case media::kCodecMSMPEG4V2:
++ case media::kCodecMSMPEG4V3:
++ case media::kCodecWMV7:
++ case media::kCodecWMV8:
++ case media::kCodecWMV9:
++ case media::kCodecVP6:
++ case media::kCodecMPEG1:
++ case media::kCodecSorensonSpark:
+ return true;
+
+ case media::kUnknownVideoCodec:
diff --git a/chromium-50-system-ffmpeg-3.patch b/chromium-50-system-ffmpeg-3.patch
index 10ba33c..5ecc59f 100644
--- a/chromium-50-system-ffmpeg-3.patch
+++ b/chromium-50-system-ffmpeg-3.patch
@@ -13,7 +13,7 @@ diff -up chromium-51.0.2687.0/third_party/webrtc/modules/video_coding/codecs/h26
+#include <libavutil/imgutils.h>
} // extern "C"
- #include "api/video/color_space.h"
+ #include "absl/memory/memory.h"
diff -up chromium-51.0.2687.0/third_party/webrtc/modules/video_coding/codecs/h264/h264_decoder_impl.h.system-ffmpeg-3 chromium-51.0.2687.0/third_party/webrtc/modules/video_coding/codecs/h264/h264_decoder_impl.h
--- chromium-51.0.2687.0/third_party/webrtc/modules/video_coding/codecs/h264/h264_decoder_impl.h.system-ffmpeg-3 2016-03-23 18:55:39.080894319 +0100
+++ chromium-51.0.2687.0/third_party/webrtc/modules/video_coding/codecs/h264/h264_decoder_impl.h 2016-03-23 18:54:32.178123691 +0100
diff --git a/chromium-69-extra-media.patch b/chromium-69-extra-media.patch
index bfba3fb..ede39f3 100644
--- a/chromium-69-extra-media.patch
+++ b/chromium-69-extra-media.patch
@@ -1,32 +1,37 @@
-diff -up chromium-69.0.3497.100/media/base/audio_codecs.cc.37~ chromium-69.0.3497.100/media/base/audio_codecs.cc
---- chromium-69.0.3497.100/media/base/audio_codecs.cc.37~ 2018-09-17 21:10:16.000000000 +0200
-+++ chromium-69.0.3497.100/media/base/audio_codecs.cc 2018-10-02 22:30:05.030093084 +0200
-@@ -46,6 +46,8 @@ std::string GetCodecName(AudioCodec code
+diff -up chromium-62.0.3192.0/media/base/audio_codecs.cc.extra-media chromium-62.0.3192.0/media/base/audio_codecs.cc
+--- chromium-62.0.3192.0/media/base/audio_codecs.cc.extra-media 2017-08-22 21:04:45.000000000 +0200
++++ chromium-62.0.3192.0/media/base/audio_codecs.cc 2017-08-30 15:39:09.735186077 +0200
+@@ -46,6 +46,10 @@ std::string GetCodecName(AudioCodec code
return "ac3";
case kCodecMpegHAudio:
return "mpeg-h-audio";
++ case kCodecMP2:
++ return "mp2";
+ case kCodecDTS:
+ return "dts";
}
NOTREACHED();
return "";
-@@ -72,6 +74,8 @@ AudioCodec StringToAudioCodec(const std:
+@@ -72,6 +74,10 @@ AudioCodec StringToAudioCodec(const std:
return kCodecVorbis;
if (base::StartsWith(codec_id, "mp4a.40.", base::CompareCase::SENSITIVE))
return kCodecAAC;
++ if (codec_id == "mp2")
++ return kCodecMP2;
+ if (codec_id == "dts")
+ return kCodecDTS;
return kUnknownAudioCodec;
}
-diff -up chromium-69.0.3497.100/media/base/audio_codecs.h.37~ chromium-69.0.3497.100/media/base/audio_codecs.h
---- chromium-69.0.3497.100/media/base/audio_codecs.h.37~ 2018-09-17 21:10:16.000000000 +0200
-+++ chromium-69.0.3497.100/media/base/audio_codecs.h 2018-10-02 22:30:05.030093084 +0200
-@@ -33,13 +33,14 @@ enum AudioCodec {
+diff -up chromium-62.0.3192.0/media/base/audio_codecs.h.extra-media chromium-62.0.3192.0/media/base/audio_codecs.h
+--- chromium-62.0.3192.0/media/base/audio_codecs.h.extra-media 2017-08-22 21:04:45.000000000 +0200
++++ chromium-62.0.3192.0/media/base/audio_codecs.h 2017-08-30 15:39:09.735186077 +0200
+@@ -33,13 +33,15 @@
kCodecALAC = 15,
kCodecAC3 = 16,
kCodecMpegHAudio = 17,
-+ kCodecDTS = 18,
++ kCodecMP2 = 18,
++ kCodecDTS = 19,
// DO NOT ADD RANDOM AUDIO CODECS!
//
// The only acceptable time to add a new codec is if there is production code
@@ -38,29 +43,9 @@ diff -up chromium-69.0.3497.100/media/base/audio_codecs.h.37~ chromium-69.0.3497
};
std::string MEDIA_EXPORT GetCodecName(AudioCodec codec);
-diff -up chromium-69.0.3497.100/media/base/decode_capabilities.cc.37~ chromium-69.0.3497.100/media/base/decode_capabilities.cc
---- chromium-69.0.3497.100/media/base/decode_capabilities.cc.37~ 2018-09-17 21:10:16.000000000 +0200
-+++ chromium-69.0.3497.100/media/base/decode_capabilities.cc 2018-10-02 22:30:05.031093090 +0200
-@@ -176,13 +176,13 @@ bool IsSupportedVideoConfig(const VideoC
- case media::kCodecH264:
- case media::kCodecVP8:
- case media::kCodecTheora:
-- return true;
--
-- case media::kUnknownVideoCodec:
- case media::kCodecVC1:
- case media::kCodecMPEG2:
- case media::kCodecMPEG4:
- case media::kCodecHEVC:
-+ return true;
-+
-+ case media::kUnknownVideoCodec:
- case media::kCodecDolbyVision:
- return false;
- }
-diff -up chromium-69.0.3497.100/media/base/mime_util_internal.cc.37~ chromium-69.0.3497.100/media/base/mime_util_internal.cc
---- chromium-69.0.3497.100/media/base/mime_util_internal.cc.37~ 2018-09-17 21:10:16.000000000 +0200
-+++ chromium-69.0.3497.100/media/base/mime_util_internal.cc 2018-10-02 22:31:21.254548374 +0200
+diff -up chromium-62.0.3192.0/media/base/mime_util_internal.cc.extra-media chromium-62.0.3192.0/media/base/mime_util_internal.cc
+--- chromium-62.0.3192.0/media/base/mime_util_internal.cc.extra-media 2017-08-22 21:04:45.000000000 +0200
++++ chromium-62.0.3192.0/media/base/mime_util_internal.cc 2017-08-30 15:44:46.519076991 +0200
@@ -87,6 +87,10 @@
{"vp8", MimeUtil::VP8},
{"vp8.0", MimeUtil::VP8},
@@ -72,7 +57,18 @@ diff -up chromium-69.0.3497.100/media/base/mime_util_internal.cc.37~ chromium-69
});
return *kStringToCodecMap;
-@@ -172,6 +174,9 @@ VideoCodec MimeUtilToVideoCodec(MimeUtil
+@@ -162,6 +166,10 @@
+ return kCodecOpus;
+ case MimeUtil::FLAC:
+ return kCodecFLAC;
++ case MimeUtil::DTS:
++ return kCodecDTS;
++ case MimeUtil::MP2:
++ return kCodecMP2;
+ default:
+ break;
+ }
+@@ -184,6 +192,9 @@
return kCodecTheora;
case MimeUtil::DOLBY_VISION:
return kCodecDolbyVision;
@@ -82,31 +78,35 @@ diff -up chromium-69.0.3497.100/media/base/mime_util_internal.cc.37~ chromium-69
default:
break;
}
-@@ -266,6 +271,31 @@ void MimeUtil::AddSupportedMediaFormats(
+@@ -274,6 +285,35 @@
CodecSet ogg_codecs(ogg_audio_codecs);
ogg_codecs.insert(ogg_video_codecs.begin(), ogg_video_codecs.end());
+ CodecSet matroska_audio_codecs;
-+ matroska_audio_codecs.insert(OPUS);
-+ matroska_audio_codecs.insert(VORBIS);
-+ matroska_audio_codecs.insert(AC3);
-+ matroska_audio_codecs.insert(EAC3);
-+ matroska_audio_codecs.insert(DTS);
-+ matroska_audio_codecs.insert(MP3);
-+ matroska_audio_codecs.insert(MP2);
-+ matroska_audio_codecs.insert(MPEG2_AAC);
-+ matroska_audio_codecs.insert(MPEG4_AAC);
-+ matroska_audio_codecs.insert(PCM);
-+
++ matroska_audio_codecs.emplace(OPUS);
++ matroska_audio_codecs.emplace(VORBIS);
++ matroska_audio_codecs.emplace(AC3);
++ matroska_audio_codecs.emplace(EAC3);
++ matroska_audio_codecs.emplace(DTS);
++ matroska_audio_codecs.emplace(MP3);
++ matroska_audio_codecs.emplace(MP2);
++ matroska_audio_codecs.emplace(MPEG2_AAC);
++ matroska_audio_codecs.emplace(MPEG4_AAC);
++ matroska_audio_codecs.emplace(PCM);
++ matroska_audio_codecs.emplace(FLAC);
++
+ CodecSet matroska_video_codecs;
-+ matroska_video_codecs.insert(THEORA);
-+ matroska_video_codecs.insert(VP8);
-+ matroska_video_codecs.insert(VP9);
-+ matroska_video_codecs.insert(H264);
-+ matroska_video_codecs.insert(MPEG4_SP);
-+ matroska_video_codecs.insert(MPEG4_ASP);
++ matroska_video_codecs.emplace(THEORA);
++ matroska_video_codecs.emplace(VP8);
++ matroska_video_codecs.emplace(VP9);
++ matroska_video_codecs.emplace(H264);
++ matroska_video_codecs.emplace(MPEG4_SP);
++ matroska_video_codecs.emplace(MPEG4_ASP);
++#if BUILDFLAG(ENABLE_AV1_DECODER)
++ matroska_video_codecs.emplace(AV1);
++#endif
+#if BUILDFLAG(ENABLE_HEVC_DEMUXING)
-+ matroska_video_codecs.insert(HEVC);
++ matroska_video_codecs.emplace(HEVC);
+#endif // BUILDFLAG(ENABLE_HEVC_DEMUXING)
+ CodecSet matroska_codecs(matroska_audio_codecs);
+ matroska_codecs.insert(matroska_video_codecs.begin(), matroska_video_codecs.end());
@@ -114,49 +114,41 @@ diff -up chromium-69.0.3497.100/media/base/mime_util_internal.cc.37~ chromium-69
const CodecSet webm_audio_codecs{OPUS, VORBIS};
CodecSet webm_video_codecs{VP8, VP9};
#if BUILDFLAG(ENABLE_AV1_DECODER)
-@@ -307,6 +337,8 @@ void MimeUtil::AddSupportedMediaFormats(
+@@ -283,9 +323,9 @@
+ CodecSet webm_codecs(webm_audio_codecs);
+ webm_codecs.insert(webm_video_codecs.begin(), webm_video_codecs.end());
+
+- const CodecSet mp3_codecs{MP3};
++ const CodecSet mp3_codecs{MP3, MP2};
+
+- CodecSet mp4_audio_codecs{FLAC, MP3, OPUS};
++ CodecSet mp4_audio_codecs{FLAC, MP3, OPUS, MP2, DTS, AC3, EAC3};
+
+ // Only VP9 with valid codec string vp09.xx.xx.xx.xx.xx.xx.xx is supported.
+ // See ParseVp9CodecID for details.
+@@ -309,6 +349,8 @@
+ #endif // BUILDFLAG(ENABLE_MPEG_H_AUDIO_DEMUXING)
+
+ mp4_video_codecs.emplace(H264);
++ mp4_video_codecs.emplace(MPEG4_SP);
++ mp4_video_codecs.emplace(MPEG4_ASP);
#if BUILDFLAG(ENABLE_HEVC_DEMUXING)
mp4_video_codecs.emplace(HEVC);
#endif // BUILDFLAG(ENABLE_HEVC_DEMUXING)
-+ mp4_video_codecs.emplace(MPEG4_SP);
-+ mp4_video_codecs.emplace(MPEG4_ASP);
-
- #if BUILDFLAG(ENABLE_DOLBY_VISION_DEMUXING)
- mp4_video_codecs.emplace(DOLBY_VISION);
-@@ -341,12 +373,16 @@ void MimeUtil::AddSupportedMediaFormats(
+@@ -345,6 +387,10 @@
DCHECK(!mp4_video_codecs.empty());
- AddContainerWithCodecs("video/mp4", mp4_codecs, false);
+ AddContainerWithCodecs("video/mp4", mp4_codecs);
-+ AddContainerWithCodecs("audio/x-matroska", matroska_audio_codecs, false);
-+ AddContainerWithCodecs("video/x-matroska", matroska_video_codecs, false);
++ AddContainerWithCodecs("audio/x-matroska", matroska_audio_codecs);
++ AddContainerWithCodecs("video/x-matroska", matroska_codecs);
++ AddContainerWithCodecs("video/x-msvideo", matroska_codecs);
+
#if BUILDFLAG(USE_PROPRIETARY_CODECS)
- AddContainerWithCodecs("audio/aac", implicit_codec, true); // AAC / ADTS.
+ AddContainerWithCodecs("audio/aac", implicit_codec); // AAC / ADTS.
// These strings are supported for backwards compatibility only and thus only
- // support the codecs needed for compatibility.
- AddContainerWithCodecs("audio/x-m4a", aac, true);
- AddContainerWithCodecs("video/x-m4v", avc_and_aac, true);
-+ AddContainerWithCodecs("video/x-msvideo", matroska_codecs, true);
-
- #if BUILDFLAG(ENABLE_MSE_MPEG2TS_STREAM_PARSER)
- CodecSet mp2t_codecs{H264, MPEG2_AAC, MPEG4_AAC, MP3};
-@@ -968,9 +1004,13 @@ bool MimeUtil::IsCodecProprietary(Codec
- case H264:
- case HEVC:
- case DOLBY_VISION:
-+ case DTS:
-+ case MPEG4_SP:
-+ case MPEG4_ASP:
- return true;
-
- case MP3:
-+ case MP2:
- case PCM:
- case VORBIS:
- case OPUS:
-diff -up chromium-69.0.3497.100/media/base/mime_util_internal.h.37~ chromium-69.0.3497.100/media/base/mime_util_internal.h
---- chromium-69.0.3497.100/media/base/mime_util_internal.h.37~ 2018-09-17 21:10:16.000000000 +0200
-+++ chromium-69.0.3497.100/media/base/mime_util_internal.h 2018-10-02 22:30:05.031093090 +0200
+diff -up chromium-62.0.3192.0/media/base/mime_util_internal.h.extra-media chromium-62.0.3192.0/media/base/mime_util_internal.h
+--- chromium-62.0.3192.0/media/base/mime_util_internal.h.extra-media 2017-08-22 21:04:45.000000000 +0200
++++ chromium-62.0.3192.0/media/base/mime_util_internal.h 2017-08-30 15:39:09.734186095 +0200
@@ -46,7 +46,11 @@ class MEDIA_EXPORT MimeUtil {
DOLBY_VISION,
AV1,
@@ -170,33 +162,77 @@ diff -up chromium-69.0.3497.100/media/base/mime_util_internal.h.37~ chromium-69.
};
// Platform configuration structure. Controls which codecs are supported at
-diff -up chromium-69.0.3497.100/media/ffmpeg/ffmpeg_common.cc.37~ chromium-69.0.3497.100/media/ffmpeg/ffmpeg_common.cc
---- chromium-69.0.3497.100/media/ffmpeg/ffmpeg_common.cc.37~ 2018-09-17 21:10:16.000000000 +0200
-+++ chromium-69.0.3497.100/media/ffmpeg/ffmpeg_common.cc 2018-10-02 22:30:05.031093090 +0200
-@@ -115,6 +115,8 @@ AudioCodec CodecIDToAudioCodec(AVCodecID
+diff -up chromium-62.0.3192.0/media/ffmpeg/ffmpeg_common.cc.extra-media chromium-62.0.3192.0/media/ffmpeg/ffmpeg_common.cc
+--- chromium-62.0.3192.0/media/ffmpeg/ffmpeg_common.cc.extra-media 2017-08-22 21:04:45.000000000 +0200
++++ chromium-62.0.3192.0/media/ffmpeg/ffmpeg_common.cc 2017-08-30 15:39:09.735186077 +0200
+@@ -115,6 +115,10 @@ AudioCodec CodecIDToAudioCodec(AVCodecID
return kCodecOpus;
case AV_CODEC_ID_ALAC:
return kCodecALAC;
++ case AV_CODEC_ID_MP2:
++ return kCodecMP2;
+ case AV_CODEC_ID_DTS:
+ return kCodecDTS;
default:
DVLOG(1) << "Unknown audio CodecID: " << codec_id;
}
-@@ -166,6 +168,10 @@ AVCodecID AudioCodecToCodecID(AudioCodec
+@@ -166,6 +168,14 @@ AVCodecID AudioCodecToCodecID(AudioCodec
return AV_CODEC_ID_PCM_MULAW;
case kCodecOpus:
return AV_CODEC_ID_OPUS;
+ case kCodecAC3:
+ return AV_CODEC_ID_AC3;
++ case kCodecEAC3:
++ return AV_CODEC_ID_EAC3;
++ case kCodecMP2:
++ return AV_CODEC_ID_MP2;
+ case kCodecDTS:
+ return AV_CODEC_ID_DTS;
default:
DVLOG(1) << "Unknown AudioCodec: " << audio_codec;
}
-diff -up chromium-69.0.3497.100/media/filters/ffmpeg_video_decoder.cc.37~ chromium-69.0.3497.100/media/filters/ffmpeg_video_decoder.cc
---- chromium-69.0.3497.100/media/filters/ffmpeg_video_decoder.cc.37~ 2018-09-17 21:10:16.000000000 +0200
-+++ chromium-69.0.3497.100/media/filters/ffmpeg_video_decoder.cc 2018-10-02 22:30:05.031093090 +0200
-@@ -58,7 +58,6 @@ static int GetThreadCount(const VideoDec
+@@ -389,23 +389,6 @@ bool AVCodecContextToAudioDecoderConfig(
+ codec_context->channels);
+
+ int sample_rate = codec_context->sample_rate;
+- switch (codec) {
+- // For AC3/EAC3 we enable only demuxing, but not decoding, so FFmpeg does
+- // not fill |sample_fmt|.
+- case kCodecAC3:
+- case kCodecEAC3:
+-#if BUILDFLAG(ENABLE_AC3_EAC3_AUDIO_DEMUXING)
+- // The spec for AC3/EAC3 audio is ETSI TS 102 366. According to sections
+- // F.3.1 and F.5.1 in that spec the sample_format for AC3/EAC3 must be 16.
+- sample_format = kSampleFormatS16;
+-#else
+- NOTREACHED();
+-#endif
+- break;
+-
+- default:
+- break;
+- }
+
+ base::TimeDelta seek_preroll;
+ if (codec_context->seek_preroll > 0) {
+@@ -435,13 +418,6 @@ bool AVCodecContextToAudioDecoderConfig(
+ if (channel_layout == CHANNEL_LAYOUT_DISCRETE)
+ config->SetChannelsForDiscrete(codec_context->channels);
+
+-#if BUILDFLAG(ENABLE_AC3_EAC3_AUDIO_DEMUXING)
+- // These are bitstream formats unknown to ffmpeg, so they don't have
+- // a known sample format size.
+- if (codec == kCodecAC3 || codec == kCodecEAC3)
+- return true;
+-#endif
+-
+ // Verify that AudioConfig.bits_per_channel was calculated correctly for
+ // codecs that have |sample_fmt| set by FFmpeg.
+ DCHECK_EQ(av_get_bytes_per_sample(codec_context->sample_fmt) * 8,
+diff -up chromium-62.0.3192.0/media/filters/ffmpeg_video_decoder.cc.extra-media chromium-62.0.3192.0/media/filters/ffmpeg_video_decoder.cc
+--- chromium-62.0.3192.0/media/filters/ffmpeg_video_decoder.cc.extra-media 2017-08-22 21:04:45.000000000 +0200
++++ chromium-62.0.3192.0/media/filters/ffmpeg_video_decoder.cc 2017-08-30 15:39:09.736186059 +0200
+@@ -38,7 +38,6 @@
case kUnknownVideoCodec:
case kCodecVC1:
case kCodecMPEG2:
@@ -204,7 +240,7 @@ diff -up chromium-69.0.3497.100/media/filters/ffmpeg_video_decoder.cc.37~ chromi
case kCodecVP9:
case kCodecAV1:
case kCodecDolbyVision:
-@@ -72,6 +71,7 @@ static int GetThreadCount(const VideoDec
+@@ -52,6 +51,7 @@
case kCodecH264:
case kCodecVP8:
@@ -212,50 +248,53 @@ diff -up chromium-69.0.3497.100/media/filters/ffmpeg_video_decoder.cc.37~ chromi
// Normalize to three threads for 1080p content, then scale linearly
// with number of pixels.
// Examples:
-diff -up chromium-69.0.3497.100/media/remoting/proto_enum_utils.cc.37~ chromium-69.0.3497.100/media/remoting/proto_enum_utils.cc
---- chromium-69.0.3497.100/media/remoting/proto_enum_utils.cc.37~ 2018-09-17 21:10:16.000000000 +0200
-+++ chromium-69.0.3497.100/media/remoting/proto_enum_utils.cc 2018-10-02 22:30:05.031093090 +0200
-@@ -58,6 +58,7 @@ base::Optional<AudioCodec> ToMediaAudioC
+diff -up chromium-62.0.3192.0/media/remoting/proto_enum_utils.cc.extra-media chromium-62.0.3192.0/media/remoting/proto_enum_utils.cc
+--- chromium-62.0.3192.0/media/remoting/proto_enum_utils.cc.extra-media 2017-08-22 21:04:45.000000000 +0200
++++ chromium-62.0.3192.0/media/remoting/proto_enum_utils.cc 2017-08-30 15:39:09.736186059 +0200
+@@ -58,6 +58,8 @@ base::Optional<AudioCodec> ToMediaAudioC
CASE_RETURN_OTHER(kCodecALAC);
CASE_RETURN_OTHER(kCodecAC3);
CASE_RETURN_OTHER(kCodecMpegHAudio);
++ CASE_RETURN_OTHER(kCodecMP2);
+ CASE_RETURN_OTHER(kCodecDTS);
}
return base::nullopt; // Not a 'default' to ensure compile-time checks.
}
-@@ -85,6 +86,7 @@ base::Optional<pb::AudioDecoderConfig::C
+@@ -85,6 +86,8 @@ base::Optional<pb::AudioDecoderConfig::C
CASE_RETURN_OTHER(kCodecALAC);
CASE_RETURN_OTHER(kCodecAC3);
CASE_RETURN_OTHER(kCodecMpegHAudio);
++ CASE_RETURN_OTHER(kCodecMP2);
+ CASE_RETURN_OTHER(kCodecDTS);
}
return base::nullopt; // Not a 'default' to ensure compile-time checks.
}
-diff -up chromium-69.0.3497.100/media/remoting/rpc.proto.37~ chromium-69.0.3497.100/media/remoting/rpc.proto
---- chromium-69.0.3497.100/media/remoting/media_remoting_rpc.proto.37~ 2018-09-17 21:10:16.000000000 +0200
-+++ chromium-69.0.3497.100/media/remoting/media_remoting_rpc.proto 2018-10-02 22:30:05.031093090 +0200
-@@ -67,6 +67,7 @@ message AudioDecoderConfig {
+diff -up chromium-62.0.3192.0/media/remoting/media_remoting_rpc.proto.extra-media chromium-62.0.3192.0/media/remoting/media_remoting_rpc.proto
+--- chromium-62.0.3192.0/media/remoting/media_remoting_rpc.proto.extra-media 2017-08-22 21:04:45.000000000 +0200
++++ chromium-62.0.3192.0/media/remoting/media_remoting_rpc.proto 2017-08-30 15:39:09.736186059 +0200
+@@ -67,6 +67,8 @@ message AudioDecoderConfig {
kCodecALAC = 15;
kCodecAC3 = 16;
kCodecMpegHAudio = 17;
-+ kCodecDTS = 18;
++ kCodecMP2 = 18;
++ kCodecDTS = 19;
}
// Proto version of media::SampleFormat.
-diff -up chromium-69.0.3497.100/net/base/mime_util.cc.37~ chromium-69.0.3497.100/net/base/mime_util.cc
---- chromium-69.0.3497.100/net/base/mime_util.cc.37~ 2018-09-17 21:10:18.000000000 +0200
-+++ chromium-69.0.3497.100/net/base/mime_util.cc 2018-10-02 22:30:05.031093090 +0200
-@@ -101,6 +101,9 @@ static const MimeInfo kPrimaryMappings[]
- {"text/xml", "xml"},
- {"video/mp4", "mp4,m4v"},
- {"video/ogg", "ogv,ogm"},
+diff -up chromium-62.0.3192.0/net/base/mime_util.cc.extra-media chromium-62.0.3192.0/net/base/mime_util.cc
+--- chromium-62.0.3192.0/net/base/mime_util.cc.extra-media 2017-08-22 21:04:46.000000000 +0200
++++ chromium-62.0.3192.0/net/base/mime_util.cc 2017-08-30 15:47:23.952221630 +0200
+@@ -94,6 +94,9 @@
+ {"image/png", "png"},
+ {"image/apng", "png"},
+ {"image/webp", "webp"},
+ {"video/x-matroska", "mkv"},
+ {"audio/x-matroska", "mkv"},
+ {"video/x-msvideo", "avi"},
- };
-
- // See comments above for details on how this list is used.
-@@ -490,6 +493,7 @@ static const char* const kStandardAudioT
+ {"multipart/related", "mht,mhtml"},
+ {"text/css", "css"},
+ {"text/html", "html,htm,shtml,shtm"},
+@@ -495,6 +498,7 @@
"audio/vorbis",
"audio/wav",
"audio/webm",
@@ -263,7 +302,7 @@ diff -up chromium-69.0.3497.100/net/base/mime_util.cc.37~ chromium-69.0.3497.100
"audio/x-m4a",
"audio/x-ms-wma",
"audio/vnd.rn-realaudio",
-@@ -507,8 +511,10 @@ static const char* const kStandardVideoT
+@@ -512,8 +516,10 @@
"video/webm",
"video/x-dv",
"video/x-m4v",
@@ -274,3 +313,66 @@ diff -up chromium-69.0.3497.100/net/base/mime_util.cc.37~ chromium-69.0.3497.100
"video/x-ms-wmv"
};
+--- chromium-73.0.3683.75/media/base/supported_types.cc.extra-media 2019-03-11 23:00:59.000000000 +0100
++++ chromium-73.0.3683.75/media/base/supported_types.cc 2019-03-17 18:40:07.610556592 +0100
+@@ -144,6 +144,7 @@ bool IsAudioCodecProprietary(AudioCodec
+ case media::kCodecAAC:
+ case media::kCodecAC3:
+ case media::kCodecEAC3:
++ case media::kCodecDTS:
+ case media::kCodecAMR_NB:
+ case media::kCodecAMR_WB:
+ case media::kCodecGSM_MS:
+@@ -152,6 +153,7 @@ bool IsAudioCodecProprietary(AudioCodec
+ return true;
+
+ case media::kCodecFLAC:
++ case media::kCodecMP2:
+ case media::kCodecMP3:
+ case media::kCodecOpus:
+ case media::kCodecVorbis:
+@@ -174,6 +176,7 @@ bool IsDefaultSupportedAudioType(const A
+ switch (type.codec) {
+ case media::kCodecAAC:
+ case media::kCodecFLAC:
++ case media::kCodecMP2:
+ case media::kCodecMP3:
+ case media::kCodecOpus:
+ case media::kCodecPCM:
+@@ -182,6 +185,10 @@ bool IsDefaultSupportedAudioType(const A
+ case media::kCodecPCM_S24BE:
+ case media::kCodecPCM_ALAW:
+ case media::kCodecVorbis:
++ case media::kCodecEAC3:
++ case media::kCodecALAC:
++ case media::kCodecAC3:
++ case media::kCodecDTS:
+ return true;
+
+ case media::kCodecAMR_NB:
+@@ -193,9 +200,6 @@ bool IsDefaultSupportedAudioType(const A
+ return false;
+ #endif
+
+- case media::kCodecEAC3:
+- case media::kCodecALAC:
+- case media::kCodecAC3:
+ case media::kCodecMpegHAudio:
+ case media::kUnknownAudioCodec:
+ return false;
+@@ -250,12 +251,12 @@ bool IsDefaultSupportedVideoType(const V
+ case media::kCodecH264:
+ case media::kCodecVP8:
+ case media::kCodecTheora:
+- return true;
+-
+- case media::kUnknownVideoCodec:
+ case media::kCodecVC1:
+ case media::kCodecMPEG2:
+ case media::kCodecHEVC:
++ return true;
++
++ case media::kUnknownVideoCodec:
+ case media::kCodecDolbyVision:
+ return false;
+
diff --git a/chromium-69-no-static-libstdc++.patch b/chromium-69-no-static-libstdc++.patch
index c2f9ea9..e3fceeb 100644
--- a/chromium-69-no-static-libstdc++.patch
+++ b/chromium-69-no-static-libstdc++.patch
@@ -8,4 +8,4 @@ diff -up chromium-69.0.3497.100/tools/gn/build/gen.py.omv~ chromium-69.0.3497.10
- '-static-libstdc++',
'-Wl,--as-needed',
])
- libs.extend([
+ # This is needed by libc++.
diff --git a/chromium-69-wmvflvmpg.patch b/chromium-69-wmvflvmpg.patch
index 9190351..25470c3 100644
--- a/chromium-69-wmvflvmpg.patch
+++ b/chromium-69-wmvflvmpg.patch
@@ -1,6 +1,6 @@
-diff -up chromium-69.0.3497.100/media/base/mime_util_internal.cc.38~ chromium-69.0.3497.100/media/base/mime_util_internal.cc
---- chromium-69.0.3497.100/media/base/mime_util_internal.cc.38~ 2018-10-02 22:33:23.202267666 +0200
-+++ chromium-69.0.3497.100/media/base/mime_util_internal.cc 2018-10-02 22:35:18.081936900 +0200
+diff -up chromium-62.0.3192.0/media/base/mime_util_internal.cc.wmvflvmpg chromium-62.0.3192.0/media/base/mime_util_internal.cc
+--- chromium-62.0.3192.0/media/base/mime_util_internal.cc.wmvflvmpg 2017-08-30 15:52:00.602204610 +0200
++++ chromium-62.0.3192.0/media/base/mime_util_internal.cc 2017-08-30 16:08:19.855437935 +0200
@@ -91,6 +91,16 @@
{"mp2", MimeUtil::MP2},
{"mp4v.20.8", MimeUtil::MPEG4_SP},
@@ -14,123 +14,74 @@ diff -up chromium-69.0.3497.100/media/base/mime_util_internal.cc.38~ chromium-69
+ {"vc-1", MimeUtil::VC1},
+ {"wma", MimeUtil::WMA},
+ {"vp6", MimeUtil::VP6},
-+ {"mpeg1", MimeUtil::MPEG1}
++ {"mpeg1", MimeUtil::MPEG1},
});
return *kStringToCodecMap;
-@@ -306,6 +311,9 @@ void MimeUtil::AddSupportedMediaFormats(
+@@ -323,6 +333,7 @@
CodecSet webm_codecs(webm_audio_codecs);
webm_codecs.insert(webm_video_codecs.begin(), webm_video_codecs.end());
-+ CodecSet mp1_codecs;
-+ mp1_codecs.insert(MPEG1);
-+
- const CodecSet mp3_codecs{MP3};
++ const CodecSet mp1_codecs{MPEG1};
+ const CodecSet mp3_codecs{MP3, MP2};
- CodecSet mp4_audio_codecs{FLAC, MP3, OPUS};
-@@ -352,6 +360,29 @@ void MimeUtil::AddSupportedMediaFormats(
+ CodecSet mp4_audio_codecs{FLAC, MP3, OPUS, MP2, DTS, AC3, EAC3};
+@@ -366,6 +377,28 @@
CodecSet mp4_codecs(mp4_audio_codecs);
mp4_codecs.insert(mp4_video_codecs.begin(), mp4_video_codecs.end());
-+ CodecSet wma_codecs;
-+ wma_codecs.insert(WMA);
++ const CodecSet wma_codecs{WMA};
+
+ CodecSet wmv_codecs(wma_codecs);
-+ wmv_codecs.insert(MSMPEG4v1);
-+ wmv_codecs.insert(MSMPEG4v2);
-+ wmv_codecs.insert(MSMPEG4v3);
-+ wmv_codecs.insert(MPEG4_SP);
-+ wmv_codecs.insert(MPEG4_ASP);
-+ wmv_codecs.insert(WMV7);
-+ wmv_codecs.insert(WMV8);
-+ wmv_codecs.insert(WMV9);
-+ wmv_codecs.insert(VC1);
++ wmv_codecs.emplace(MSMPEG4v1);
++ wmv_codecs.emplace(MSMPEG4v2);
++ wmv_codecs.emplace(MSMPEG4v3);
++ wmv_codecs.emplace(MPEG4_SP);
++ wmv_codecs.emplace(MPEG4_ASP);
++ wmv_codecs.emplace(WMV7);
++ wmv_codecs.emplace(WMV8);
++ wmv_codecs.emplace(WMV9);
++ wmv_codecs.emplace(VC1);
+
-+ matroska_codecs.insert(MSMPEG4v1);
-+ matroska_codecs.insert(MSMPEG4v2);
-+ matroska_codecs.insert(MSMPEG4v3);
++ matroska_codecs.emplace(MSMPEG4v1);
++ matroska_codecs.emplace(MSMPEG4v2);
++ matroska_codecs.emplace(MSMPEG4v3);
+
-+ CodecSet flv_codecs;
-+ flv_codecs.insert(VP6);
-+ flv_codecs.insert(mp4_codecs.begin(), mp4_codecs.end());
-+ flv_codecs.insert(MP3);
++ CodecSet flv_codecs(mp4_codecs);
++ flv_codecs.emplace(VP6);
++ flv_codecs.emplace(MP3);
++ flv_codecs.emplace(FLV1);
+
const CodecSet implicit_codec;
- AddContainerWithCodecs("audio/wav", wav_codecs, false);
- AddContainerWithCodecs("audio/x-wav", wav_codecs, false);
-@@ -375,6 +406,11 @@ void MimeUtil::AddSupportedMediaFormats(
-
- AddContainerWithCodecs("audio/x-matroska", matroska_audio_codecs, false);
- AddContainerWithCodecs("video/x-matroska", matroska_video_codecs, false);
-+ AddContainerWithCodecs("video/x-ms-wmv", wmv_codecs, true);
-+ AddContainerWithCodecs("video/x-ms-wma", wma_codecs, true);
-+ AddContainerWithCodecs("video/x-ms-asf", wmv_codecs, true);
-+ AddContainerWithCodecs("video/x-flv", flv_codecs, true);
-+ AddContainerWithCodecs("video/mpeg", mp1_codecs, true);
+ AddContainerWithCodecs("audio/wav", wav_codecs);
+ AddContainerWithCodecs("audio/x-wav", wav_codecs);
+@@ -389,6 +421,11 @@
+ AddContainerWithCodecs("audio/x-matroska", matroska_audio_codecs);
+ AddContainerWithCodecs("video/x-matroska", matroska_codecs);
+ AddContainerWithCodecs("video/x-msvideo", matroska_codecs);
++ AddContainerWithCodecs("video/x-ms-wmv", wmv_codecs);
++ AddContainerWithCodecs("audio/x-ms-wma", wma_codecs);
++ AddContainerWithCodecs("video/x-ms-asf", wmv_codecs);
++ AddContainerWithCodecs("video/x-flv", flv_codecs);
++ AddContainerWithCodecs("video/mpeg", mp1_codecs);
#if BUILDFLAG(USE_PROPRIETARY_CODECS)
- AddContainerWithCodecs("audio/aac", implicit_codec, true); // AAC / ADTS.
-@@ -1007,6 +1043,15 @@ bool MimeUtil::IsCodecProprietary(Codec
- case DTS:
- case MPEG4_SP:
- case MPEG4_ASP:
-+ case MSMPEG4v1:
-+ case MSMPEG4v2:
-+ case MSMPEG4v3:
-+ case WMV7:
-+ case WMV8:
-+ case WMV9:
-+ case VC1:
-+ case WMA:
-+ case VP6:
- return true;
-
- case MP3:
-@@ -1018,6 +1063,7 @@ bool MimeUtil::IsCodecProprietary(Codec
- case VP8:
- case VP9:
- case THEORA:
-+ case MPEG1:
- case AV1:
- return false;
- }
-diff -up chromium-69.0.3497.100/media/base/mime_util_internal.h.38~ chromium-69.0.3497.100/media/base/mime_util_internal.h
---- chromium-69.0.3497.100/media/base/mime_util_internal.h.38~ 2018-10-02 22:33:23.202267666 +0200
-+++ chromium-69.0.3497.100/media/base/mime_util_internal.h 2018-10-02 22:33:23.205267683 +0200
-@@ -50,7 +50,17 @@ class MEDIA_EXPORT MimeUtil {
- MP2,
- MPEG4_SP,
- MPEG4_ASP,
-- LAST_CODEC = MPEG4_ASP
-+ MSMPEG4v1,
-+ MSMPEG4v2,
-+ MSMPEG4v3,
-+ WMV7,
-+ WMV8,
-+ WMV9,
-+ VC1,
-+ WMA,
-+ VP6,
-+ MPEG1,
-+ LAST_CODEC = MPEG1
- };
-
- // Platform configuration structure. Controls which codecs are supported at
-diff -up chromium-69.0.3497.100/net/base/mime_util.cc.38~ chromium-69.0.3497.100/net/base/mime_util.cc
---- chromium-69.0.3497.100/net/base/mime_util.cc.38~ 2018-10-02 22:33:23.203267672 +0200
-+++ chromium-69.0.3497.100/net/base/mime_util.cc 2018-10-02 22:33:23.205267683 +0200
-@@ -104,6 +104,10 @@ static const MimeInfo kPrimaryMappings[]
+ AddContainerWithCodecs("audio/aac", implicit_codec); // AAC / ADTS.
+diff -up chromium-62.0.3192.0/net/base/mime_util.cc.wmvflvmpg chromium-62.0.3192.0/net/base/mime_util.cc
+--- chromium-62.0.3192.0/net/base/mime_util.cc.wmvflvmpg 2017-08-30 15:52:00.604204573 +0200
++++ chromium-62.0.3192.0/net/base/mime_util.cc 2017-08-30 16:08:50.210885222 +0200
+@@ -94,6 +94,10 @@ static const MimeInfo kPrimaryMappings[]
{"video/x-matroska", "mkv"},
{"audio/x-matroska", "mkv"},
{"video/x-msvideo", "avi"},
+ {"video/x-ms-wmv", "wmv"},
+ {"audio/x-ms-wma", "wma"},
+ {"video/x-flv", "flv"},
-+ {"video/mpeg", "mpg,mpeg"}
- };
-
- // See comments above for details on how this list is used.
-@@ -510,6 +514,7 @@ static const char* const kStandardVideoT
++ {"video/mpeg", "mpg,mpeg"},
+ {"multipart/related", "mht,mhtml"},
+ {"text/css", "css"},
+ {"text/html", "html,htm,shtml,shtm"},
+@@ -512,6 +516,7 @@ static const char* const kStandardVideoT
"video/sd-video",
"video/webm",
"video/x-dv",
diff --git a/chromium-69.0.3497.81-norar.patch b/chromium-69.0.3497.81-norar.patch
deleted file mode 100644
index d0cb8e2..0000000
--- a/chromium-69.0.3497.81-norar.patch
+++ /dev/null
@@ -1,79 +0,0 @@
-diff -up chromium-69.0.3497.81/chrome/common/safe_browsing/BUILD.gn.nounrar chromium-69.0.3497.81/chrome/common/safe_browsing/BUILD.gn
---- chromium-69.0.3497.81/chrome/common/safe_browsing/BUILD.gn.nounrar 2018-09-06 13:29:47.114511569 -0400
-+++ chromium-69.0.3497.81/chrome/common/safe_browsing/BUILD.gn 2018-09-06 13:29:47.120511452 -0400
-@@ -55,40 +55,6 @@ if (safe_browsing_mode == 1) {
- "//components/safe_browsing:csd_proto",
- ]
- }
--
-- source_set("rar_analyzer") {
-- sources = [
-- "rar_analyzer.cc",
-- "rar_analyzer.h",
-- ]
--
-- deps = [
-- ":archive_analyzer_results",
-- ":download_type_util",
-- ":file_type_policies",
-- "//base",
-- "//base:i18n",
-- "//third_party/unrar:unrar",
-- ]
--
-- defines = [
-- "_FILE_OFFSET_BITS=64",
-- "LARGEFILE_SOURCE",
-- "RAR_SMP",
-- "SILENT",
--
-- # The following is set to disable certain macro definitions in the unrar
-- # source code.
-- "CHROMIUM_UNRAR",
--
-- # Disables exceptions in unrar, replaces them with process termination.
-- "UNRAR_NO_EXCEPTIONS",
-- ]
--
-- public_deps = [
-- "//components/safe_browsing:csd_proto",
-- ]
-- }
-
- source_set("disk_image_type_sniffer_mac") {
- sources = [
-@@ -121,7 +87,6 @@ source_set("safe_browsing") {
- deps += [
- ":archive_analyzer_results",
- ":download_type_util",
-- ":rar_analyzer",
- "//components/safe_browsing:features",
- ]
-
-diff -up chromium-69.0.3497.81/chrome/common/safe_browsing/DEPS.nounrar chromium-69.0.3497.81/chrome/common/safe_browsing/DEPS
---- chromium-69.0.3497.81/chrome/common/safe_browsing/DEPS.nounrar 2018-09-06 13:29:47.119511472 -0400
-+++ chromium-69.0.3497.81/chrome/common/safe_browsing/DEPS 2018-09-06 13:29:47.116511530 -0400
-@@ -1,6 +1,5 @@
- include_rules = [
- "+components/safe_browsing",
- "+third_party/protobuf",
-- "+third_party/unrar",
- "+third_party/zlib",
- ]
-diff -up chromium-69.0.3497.81/chrome/services/file_util/safe_archive_analyzer.cc.nounrar chromium-69.0.3497.81/chrome/services/file_util/safe_archive_analyzer.cc
---- chromium-69.0.3497.81/chrome/services/file_util/safe_archive_analyzer.cc.nounrar 2018-09-07 10:10:42.286041744 -0400
-+++ chromium-69.0.3497.81/chrome/services/file_util/safe_archive_analyzer.cc 2018-09-07 10:11:14.934308285 -0400
-@@ -47,9 +47,13 @@ void SafeArchiveAnalyzer::AnalyzeDmgFile
-
- void SafeArchiveAnalyzer::AnalyzeRarFile(base::File rar_file,
- AnalyzeRarFileCallback callback) {
-+#if 0
- DCHECK(rar_file.IsValid());
-
- safe_browsing::ArchiveAnalyzerResults results;
- safe_browsing::rar_analyzer::AnalyzeRarFile(std::move(rar_file), &results);
- std::move(callback).Run(results);
-+#else
-+ NOTREACHED();
-+#endif
- }
diff --git a/chromium-70.0.3538.77-gcc7.patch b/chromium-70.0.3538.77-gcc7.patch
index 537e1bd..3b62aae 100644
--- a/chromium-70.0.3538.77-gcc7.patch
+++ b/chromium-70.0.3538.77-gcc7.patch
@@ -62,15 +62,21 @@
const MediaSink::Id& id() const { return sink_id_; }
--- chromium-70.0.3538.77/chrome/common/media_router/media_sink.cc.orig 2018-11-08 23:17:22.962379907 +0000
+++ chromium-70.0.3538.77/chrome/common/media_router/media_sink.cc 2018-11-08 23:17:36.625379033 +0000
-@@ -24,7 +24,7 @@
+@@ -19,12 +19,12 @@ MediaSink::MediaSink(const MediaSink::Id
+ provider_id_(provider_id) {}
+
+ MediaSink::MediaSink(const MediaSink& other) = default;
+-MediaSink::MediaSink(MediaSink&& other) noexcept = default;
++MediaSink::MediaSink(MediaSink&& other) = default;
+ MediaSink::MediaSink() = default;
MediaSink::~MediaSink() = default;
MediaSink& MediaSink::operator=(const MediaSink& other) = default;
-MediaSink& MediaSink::operator=(MediaSink&& other) noexcept = default;
+MediaSink& MediaSink::operator=(MediaSink&& other) = default;
- bool MediaSink::Equals(const MediaSink& other) const {
- return sink_id_ == other.sink_id_;
+ bool MediaSink::IsMaybeCloudSink() const {
+ switch (icon_type_) {
--- chromium-70.0.3538.77/components/policy/core/common/policy_map.cc.orig 2018-11-08 23:55:51.325232293 +0000
+++ chromium-70.0.3538.77/components/policy/core/common/policy_map.cc 2018-11-08 23:56:17.654230610 +0000
@@ -18,7 +18,7 @@
@@ -93,20 +99,18 @@
// Returns a copy of |this|.
Entry DeepCopy() const;
---- chromium-70.0.3538.77/components/signin/core/browser/account_info.h.orig 2018-11-09 00:03:20.709203557 +0000
-+++ chromium-70.0.3538.77/components/signin/core/browser/account_info.h 2018-11-09 00:03:59.284201090 +0000
-@@ -20,7 +20,7 @@
- AccountInfo(AccountInfo&& other) noexcept;
-
- AccountInfo& operator=(const AccountInfo& other);
-- AccountInfo& operator=(AccountInfo&& other) noexcept;
-+ AccountInfo& operator=(AccountInfo&& other);
-
- std::string account_id; // The account ID used by OAuth2TokenService.
- std::string gaia;
--- chromium-70.0.3538.77/components/signin/core/browser/account_info.cc.orig 2018-11-09 00:03:15.789203871 +0000
+++ chromium-70.0.3538.77/components/signin/core/browser/account_info.cc 2018-11-09 00:03:52.644201514 +0000
-@@ -32,7 +32,7 @@
+@@ -51,7 +51,7 @@
+ CoreAccountInfo& CoreAccountInfo::operator=(const CoreAccountInfo& other) =
+ default;
+
+-CoreAccountInfo& CoreAccountInfo::operator=(CoreAccountInfo&& other) noexcept =
++CoreAccountInfo& CoreAccountInfo::operator=(CoreAccountInfo&& other) =
+ default;
+
+ bool CoreAccountInfo::IsEmpty() const {
+@@ -64,7 +64,7 @@ AccountInfo::AccountInfo(AccountInfo&& o
AccountInfo& AccountInfo::operator=(const AccountInfo& other) = default;
@@ -114,4 +118,4 @@
+AccountInfo& AccountInfo::operator=(AccountInfo&& other) = default;
bool AccountInfo::IsEmpty() const {
- return account_id.empty() && email.empty() && gaia.empty() &&
+ return CoreAccountInfo::IsEmpty() && hosted_domain.empty() &&
diff --git a/chromium-73.0.3683.75-norar.patch b/chromium-73.0.3683.75-norar.patch
new file mode 100644
index 0000000..d61fd9c
--- /dev/null
+++ b/chromium-73.0.3683.75-norar.patch
@@ -0,0 +1,81 @@
+diff -up chromium-73.0.3683.75/chrome/common/safe_browsing/BUILD.gn.nounrar chromium-73.0.3683.75/chrome/common/safe_browsing/BUILD.gn
+--- chromium-73.0.3683.75/chrome/common/safe_browsing/BUILD.gn.nounrar 2019-03-13 08:59:45.988801102 -0400
++++ chromium-73.0.3683.75/chrome/common/safe_browsing/BUILD.gn 2019-03-13 09:00:20.244977448 -0400
+@@ -64,41 +64,6 @@ if (safe_browsing_mode == 1) {
+ ]
+ }
+
+- source_set("rar_analyzer") {
+- sources = [
+- "rar_analyzer.cc",
+- "rar_analyzer.h",
+- ]
+-
+- deps = [
+- ":archive_analyzer_results",
+- ":download_type_util",
+- ":file_type_policies",
+- "//base",
+- "//base:i18n",
+- "//components/safe_browsing:features",
+- "//third_party/unrar:unrar",
+- ]
+-
+- defines = [
+- "_FILE_OFFSET_BITS=64",
+- "LARGEFILE_SOURCE",
+- "RAR_SMP",
+- "SILENT",
+-
+- # The following is set to disable certain macro definitions in the unrar
+- # source code.
+- "CHROMIUM_UNRAR",
+-
+- # Disables exceptions in unrar, replaces them with process termination.
+- "UNRAR_NO_EXCEPTIONS",
+- ]
+-
+- public_deps = [
+- "//components/safe_browsing:csd_proto",
+- ]
+- }
+-
+ source_set("disk_image_type_sniffer_mac") {
+ sources = [
+ "disk_image_type_sniffer_mac.cc",
+@@ -167,7 +132,6 @@ source_set("safe_browsing") {
+ ":archive_analyzer_results",
+ ":binary_feature_extractor",
+ ":download_type_util",
+- ":rar_analyzer",
+ "//components/safe_browsing:features",
+ ]
+
+diff -up chromium-73.0.3683.75/chrome/common/safe_browsing/DEPS.nounrar chromium-73.0.3683.75/chrome/common/safe_browsing/DEPS
+--- chromium-73.0.3683.75/chrome/common/safe_browsing/DEPS.nounrar 2019-03-11 18:00:54.000000000 -0400
++++ chromium-73.0.3683.75/chrome/common/safe_browsing/DEPS 2019-03-13 08:59:26.513282690 -0400
+@@ -1,6 +1,5 @@
+ include_rules = [
+ "+components/safe_browsing",
+ "+third_party/protobuf",
+- "+third_party/unrar",
+ "+third_party/zlib",
+ ]
+diff -up chromium-73.0.3683.75/chrome/services/file_util/safe_archive_analyzer.cc.nounrar chromium-73.0.3683.75/chrome/services/file_util/safe_archive_analyzer.cc
+--- chromium-73.0.3683.75/chrome/services/file_util/safe_archive_analyzer.cc.nounrar 2019-03-13 08:59:26.518282566 -0400
++++ chromium-73.0.3683.75/chrome/services/file_util/safe_archive_analyzer.cc 2019-03-13 09:01:03.885935483 -0400
+@@ -48,10 +48,14 @@ void SafeArchiveAnalyzer::AnalyzeDmgFile
+ void SafeArchiveAnalyzer::AnalyzeRarFile(base::File rar_file,
+ base::File temporary_file,
+ AnalyzeRarFileCallback callback) {
++#if 0
+ DCHECK(rar_file.IsValid());
+
+ safe_browsing::ArchiveAnalyzerResults results;
+ safe_browsing::rar_analyzer::AnalyzeRarFile(
+ std::move(rar_file), std::move(temporary_file), &results);
+ std::move(callback).Run(results);
++#else
++ NOTREACHED();
++#endif
+ }
diff --git a/chromium-74.0.3729.108-revert_values.patch b/chromium-74.0.3729.108-revert_values.patch
new file mode 100644
index 0000000..447b207
--- /dev/null
+++ b/chromium-74.0.3729.108-revert_values.patch
@@ -0,0 +1,329 @@
+--- b/base/values.cc
++++ a/base/values.cc
+@@ -22,20 +22,6 @@
+
+ namespace base {
+
+-// base::Value must be standard layout to guarantee that writing to
+-// |bool_type_| then reading |type_| is defined behaviour. See:
+-//
+-// [class.union]:
+-// If a standard-layout union contains several standard-layout structs that
+-// share a common initial sequence (9.2), and if an object of this
+-// standard-layout union type contains one of the standard-layout structs,
+-// it is permitted to inspect the common initial sequence of any of
+-// standard-layout struct members;
+-//
+-static_assert(std::is_standard_layout<Value>::value,
+- "base::Value should be a standard-layout C++ class in order "
+- "to avoid undefined behaviour in its implementation!");
+-
+ namespace {
+
+ const char* const kTypeNames[] = {"null", "boolean", "integer", "double",
+@@ -90,7 +76,7 @@
+
+ } // namespace
+
++constexpr uint32_t Value::kMagicIsAlive;
+-constexpr uint16_t Value::kMagicIsAlive;
+
+ // static
+ std::unique_ptr<Value> Value::CreateWithCopiedBuffer(const char* buffer,
+@@ -112,9 +98,9 @@
+ InternalMoveConstructFrom(std::move(that));
+ }
+
++Value::Value() noexcept : type_(Type::NONE) {}
+-Value::Value() noexcept : type_(Type::NONE), is_alive_(kMagicIsAlive) {}
+
++Value::Value(Type type) : type_(type) {
+-Value::Value(Type type) : type_(type), is_alive_(kMagicIsAlive) {
+ // Initialize with the default value.
+ switch (type_) {
+ case Type::NONE:
+@@ -144,20 +130,11 @@
+ }
+ }
+
++Value::Value(bool in_bool) : type_(Type::BOOLEAN), bool_value_(in_bool) {}
+-Value::Value(bool in_bool)
+- : bool_type_(Type::BOOLEAN),
+- bool_is_alive_(kMagicIsAlive),
+- bool_value_(in_bool) {}
+
++Value::Value(int in_int) : type_(Type::INTEGER), int_value_(in_int) {}
+-Value::Value(int in_int)
+- : int_type_(Type::INTEGER),
+- int_is_alive_(kMagicIsAlive),
+- int_value_(in_int) {}
+
++Value::Value(double in_double) : type_(Type::DOUBLE), double_value_(in_double) {
+-Value::Value(double in_double)
+- : double_type_(Type::DOUBLE),
+- double_is_alive_(kMagicIsAlive),
+- double_value_(in_double) {
+ if (!std::isfinite(double_value_)) {
+ NOTREACHED() << "Non-finite (i.e. NaN or positive/negative infinity) "
+ << "values cannot be represented in JSON";
+@@ -170,9 +147,7 @@
+ Value::Value(StringPiece in_string) : Value(std::string(in_string)) {}
+
+ Value::Value(std::string&& in_string) noexcept
++ : type_(Type::STRING), string_value_(std::move(in_string)) {
+- : string_type_(Type::STRING),
+- string_is_alive_(kMagicIsAlive),
+- string_value_(std::move(in_string)) {
+ DCHECK(IsStringUTF8(string_value_));
+ }
+
+@@ -181,22 +156,15 @@
+ Value::Value(StringPiece16 in_string16) : Value(UTF16ToUTF8(in_string16)) {}
+
+ Value::Value(const std::vector<char>& in_blob)
++ : type_(Type::BINARY), binary_value_(in_blob.begin(), in_blob.end()) {}
+- : binary_type_(Type::BINARY),
+- binary_is_alive_(kMagicIsAlive),
+- binary_value_(in_blob.begin(), in_blob.end()) {}
+
+ Value::Value(base::span<const uint8_t> in_blob)
++ : type_(Type::BINARY), binary_value_(in_blob.begin(), in_blob.end()) {}
+- : binary_type_(Type::BINARY),
+- binary_is_alive_(kMagicIsAlive),
+- binary_value_(in_blob.begin(), in_blob.end()) {}
+
+ Value::Value(BlobStorage&& in_blob) noexcept
++ : type_(Type::BINARY), binary_value_(std::move(in_blob)) {}
+- : binary_type_(Type::BINARY),
+- binary_is_alive_(kMagicIsAlive),
+- binary_value_(std::move(in_blob)) {}
+
++Value::Value(const DictStorage& in_dict) : type_(Type::DICTIONARY), dict_() {
+-Value::Value(const DictStorage& in_dict)
+- : dict_type_(Type::DICTIONARY), dict_is_alive_(kMagicIsAlive), dict_() {
+ dict_.reserve(in_dict.size());
+ for (const auto& it : in_dict) {
+ dict_.try_emplace(dict_.end(), it.first,
+@@ -205,21 +173,16 @@
+ }
+
+ Value::Value(DictStorage&& in_dict) noexcept
++ : type_(Type::DICTIONARY), dict_(std::move(in_dict)) {}
+- : dict_type_(Type::DICTIONARY),
+- dict_is_alive_(kMagicIsAlive),
+- dict_(std::move(in_dict)) {}
+
++Value::Value(const ListStorage& in_list) : type_(Type::LIST), list_() {
+-Value::Value(const ListStorage& in_list)
+- : list_type_(Type::LIST), list_is_alive_(kMagicIsAlive), list_() {
+ list_.reserve(in_list.size());
+ for (const auto& val : in_list)
+ list_.emplace_back(val.Clone());
+ }
+
+ Value::Value(ListStorage&& in_list) noexcept
++ : type_(Type::LIST), list_(std::move(in_list)) {}
+- : list_type_(Type::LIST),
+- list_is_alive_(kMagicIsAlive),
+- list_(std::move(in_list)) {}
+
+ Value& Value::operator=(Value&& that) noexcept {
+ InternalCleanup();
+@@ -733,7 +696,6 @@
+
+ void Value::InternalMoveConstructFrom(Value&& that) {
+ type_ = that.type_;
+- is_alive_ = that.is_alive_;
+
+ switch (type_) {
+ case Type::NONE:
+--- b/base/values.h
++++ a/base/values.h
+@@ -96,6 +96,10 @@
+ // Note: Do not add more types. See the file-level comment above for why.
+ };
+
++ // Magic IsAlive signature to debug double frees.
++ // TODO(crbug.com/859477): Remove once root cause is found.
++ static constexpr uint32_t kMagicIsAlive = 0x15272f19;
++
+ // For situations where you want to keep ownership of your buffer, this
+ // factory method creates a new BinaryValue by copying the contents of the
+ // buffer that's passed in.
+@@ -375,100 +379,28 @@
+ size_t EstimateMemoryUsage() const;
+
+ protected:
++ // TODO(crbug.com/646113): Make these private once DictionaryValue and
++ // ListValue are properly inlined.
++ Type type_;
+- // Magic IsAlive signature to debug double frees.
+- // TODO(crbug.com/859477): Remove once root cause is found.
+- static constexpr uint16_t kMagicIsAlive = 0x2f19;
+
+- // Technical note:
+- // The naive way to implement a tagged union leads to wasted bytes
+- // in the object on CPUs like ARM ones, which impose an 8-byte alignment
+- // for double values. I.e. if one does something like:
+- //
+- // struct TaggedValue {
+- // int type_; // size = 1, align = 4
+- // union {
+- // bool bool_value_; // size = 1, align = 1
+- // int int_value_; // size = 4, align = 4
+- // double double_value_; // size = 8, align = 8
+- // std::string string_value_; // size = 12, align = 4 (32-bit)
+- // };
+- // };
+- //
+- // The end result is that the union will have an alignment of 8, and a size
+- // of 16, due to 4 extra padding bytes following |string_value_| to respect
+- // the alignment requirement.
+- //
+- // As a consequence, the struct TaggedValue will have a size of 24 bytes,
+- // due to the size of the union (16), the size of |type_| (4) and 4 bytes
+- // of padding between |type_| and the union to respect its alignment.
+- //
+- // This means 8 bytes of unused memory per instance on 32-bit ARM!
+- //
+- // To reclaim these, a union of structs is used instead, in order to ensure
+- // that |double_value_| below is always located at an offset that is a
+- // multiple of 8, relative to the start of the overall data structure.
+- //
+- // Each struct must declare its own |type_| and |is_alive_| field, which
+- // must have a different name, to appease the C++ compiler.
+- //
+- // Using this technique sizeof(base::Value) == 16 on 32-bit ARM instead
+- // of 24, without losing any information. Results are unchanged for x86,
+- // x86_64 and arm64 (16, 32 and 32 bytes respectively).
+ union {
++ bool bool_value_;
++ int int_value_;
++ double double_value_;
++ std::string string_value_;
++ BlobStorage binary_value_;
++ DictStorage dict_;
++ ListStorage list_;
+- struct {
+- // TODO(crbug.com/646113): Make these private once DictionaryValue and
+- // ListValue are properly inlined.
+- Type type_ : 8;
+-
+- // IsAlive member to debug double frees.
+- // TODO(crbug.com/859477): Remove once root cause is found.
+- uint16_t is_alive_ = kMagicIsAlive;
+- };
+- struct {
+- Type bool_type_ : 8;
+- uint16_t bool_is_alive_;
+- bool bool_value_;
+- };
+- struct {
+- Type int_type_ : 8;
+- uint16_t int_is_alive_;
+- int int_value_;
+- };
+- struct {
+- Type double_type_ : 8;
+- uint16_t double_is_alive_;
+- // Subtle: On architectures that require it, the compiler will ensure
+- // that |double_value_|'s offset is a multiple of 8 (e.g. 32-bit ARM).
+- // See technical note above to understand why it is important.
+- double double_value_;
+- };
+- struct {
+- Type string_type_ : 8;
+- uint16_t string_is_alive_;
+- std::string string_value_;
+- };
+- struct {
+- Type binary_type_ : 8;
+- uint16_t binary_is_alive_;
+- BlobStorage binary_value_;
+- };
+- struct {
+- Type dict_type_ : 8;
+- uint16_t dict_is_alive_;
+- DictStorage dict_;
+- };
+- struct {
+- Type list_type_ : 8;
+- uint16_t list_is_alive_;
+- ListStorage list_;
+- };
+ };
+
+ private:
+- friend class ValuesTest_SizeOfValue_Test;
+ void InternalMoveConstructFrom(Value&& that);
+ void InternalCleanup();
+
++ // IsAlive member to debug double frees.
++ // TODO(crbug.com/859477): Remove once root cause is found.
++ uint32_t is_alive_ = kMagicIsAlive;
++
+ DISALLOW_COPY_AND_ASSIGN(Value);
+ };
+
+--- b/base/values_unittest.cc
++++ a/base/values_unittest.cc
+@@ -6,7 +6,6 @@
+
+ #include <stddef.h>
+
+-#include <algorithm>
+ #include <functional>
+ #include <limits>
+ #include <memory>
+@@ -16,7 +15,6 @@
+ #include <vector>
+
+ #include "base/containers/adapters.h"
+-#include "base/logging.h"
+ #include "base/strings/string16.h"
+ #include "base/strings/string_piece.h"
+ #include "base/strings/utf_string_conversions.h"
+@@ -25,43 +23,6 @@
+
+ namespace base {
+
+-TEST(ValuesTest, SizeOfValue) {
+- // Ensure that base::Value is as small as possible, i.e. that there is
+- // no wasted space after the inner value due to alignment constraints.
+- // Distinguish between the 'header' that includes |type_| and |is_alive_|
+- // and the inner value that follows it, which can be a bool, int, double,
+- // string, blob, list or dict.
+-#define INNER_TYPES_LIST(X) \
+- X(bool, bool_value_) \
+- X(int, int_value_) \
+- X(double, double_value_) \
+- X(std::string, string_value_) \
+- X(Value::BlobStorage, binary_value_) \
+- X(Value::ListStorage, list_) \
+- X(Value::DictStorage, dict_)
+-
+-#define INNER_STRUCT_LIMIT(type, value) offsetof(Value, value) + sizeof(type),
+-
+- // Return the maximum size in bytes of each inner struct inside base::Value
+- size_t max_inner_struct_limit =
+- std::max({INNER_TYPES_LIST(INNER_STRUCT_LIMIT)});
+-
+- // Ensure that base::Value is not larger than necessary, i.e. that there is
+- // no un-necessary padding afte the structs due to alignment constraints of
+- // one of the inner fields.
+- EXPECT_EQ(max_inner_struct_limit, sizeof(Value));
+- if (max_inner_struct_limit != sizeof(Value)) {
+- // The following are useful to understand what's wrong when the EXPECT_EQ()
+- // above actually fails.
+-#define PRINT_INNER_FIELD_INFO(x, y) \
+- LOG(INFO) << #y " type=" #x " size=" << sizeof(x) << " align=" << alignof(x);
+-
+- LOG(INFO) << "Value size=" << sizeof(Value) << " align=" << alignof(Value);
+- INNER_TYPES_LIST(PRINT_INNER_FIELD_INFO)
+- LOG(INFO) << "max_inner_struct_limit=" << max_inner_struct_limit;
+- }
+-}
+-
+ TEST(ValuesTest, TestNothrow) {
+ static_assert(std::is_nothrow_move_constructible<Value>::value,
+ "IsNothrowMoveConstructible");
diff --git a/chromium-browser-stable.spec b/chromium-browser-stable.spec
index 2b9034d..1c99de6 100644
--- a/chromium-browser-stable.spec
+++ b/chromium-browser-stable.spec
@@ -48,7 +48,7 @@
Name: chromium-browser-%{channel}
# Working version numbers can be found at
# http://omahaproxy.appspot.com/
-Version: 72.0.3626.81
+Version: 74.0.3729.131
Release: 1%{?extrarelsuffix}
Summary: A fast webkit-based web browser
Group: Networking/WWW
@@ -92,7 +92,7 @@ Patch24: https://src.fedoraproject.org/rpms/chromium/raw/master/f/chromiu
Patch25: https://src.fedoraproject.org/rpms/chromium/raw/master/f/chromium-54.0.2840.59-jpeg-include-dir.patch
# On i686, pass --no-keep-memory --reduce-memory-overheads to ld.
Patch26: https://src.fedoraproject.org/rpms/chromium/raw/master/f/chromium-59.0.3071.86-i686-ld-memory-tricks.patch
-Patch32: https://src.fedoraproject.org/rpms/chromium/raw/master/f/chromium-69.0.3497.81-norar.patch
+Patch32: https://src.fedoraproject.org/rpms/chromium/raw/master/f/chromium-73.0.3683.75-norar.patch
Patch33: chromium-50-system-ffmpeg-3.patch
Patch36: https://src.fedoraproject.org/rpms/chromium/raw/master/f/chromium-58.0.3029.96-revert-b794998819088f76b4cf44c8db6940240c563cf4.patch
# Correctly compile the stdatomic.h in ffmpeg with gcc 4.8
@@ -126,7 +126,7 @@ Patch67: https://src.fedoraproject.org/rpms/chromium/raw/master/f/chromium-65.0.
# From Debian
Patch86: https://src.fedoraproject.org/rpms/chromium/raw/master/f/chromium-67.0.3396.62-skia-aarch64-buildfix.patch
# Use lstdc++ on EPEL7 only
-Patch87: https://src.fedoraproject.org/rpms/chromium/raw/master/f/chromium-65.0.3325.162-epel7-stdc++.patch
+#Patch87: https://src.fedoraproject.org/rpms/chromium/raw/master/f/chromium-65.0.3325.162-epel7-stdc++.patch
# Missing files in tarball
Patch88: https://src.fedoraproject.org/rpms/chromium/raw/master/f/chromium-66.0.3359.117-missing-files.patch
# https://chromium.googlesource.com/chromium/src/+/ba4141e451f4e0b1b19410b1b503bd32e150df06%5E%21/#F0
@@ -147,6 +147,11 @@ Patch94: https://src.fedoraproject.org/rpms/chromium/raw/master/f/chromium-66.0.
Patch98: https://src.fedoraproject.org/rpms/chromium/raw/master/f/chromium-69.0.3497.81-gcc8-alignof.patch
# Don't build in a Debian chroot
Patch99: https://src.fedoraproject.org/rpms/chromium/raw/master/f/chromium-69.0.3497.81-build-sanely-please.patch
+# Debian fix gcc failure
+Patch100: quic.patch
+# debian - constexpr fixes
+Patch101: not-constexpr.patch
+Patch102: move-required.patch
### Chromium Tests Patches ###
# suse, system libs
@@ -159,7 +164,8 @@ Patch202: https://raw.githubusercontent.com/archlinuxarm/PKGBUILDs/master/extra/
# mga
Patch300: chromium-69-extra-media.patch
Patch301: chromium-69-wmvflvmpg.patch
-Patch302: chromium-55-flac.patch
+Patch302: chromium-40-sorenson-spark.patch
+#Patch302: chromium-55-flac.patch
# omv
Patch500: chromium-59-clang-workaround.patch
@@ -167,12 +173,14 @@ Patch501: chromium-64-system-curl.patch
Patch502: chromium-69-no-static-libstdc++.patch
Patch503: revert-Xclang-instcombine-lower-dbg-declare.patch
Patch504: chromium-70.0.3538.77-gcc7.patch
-Patch505: chromium-72.0.3626.81-memset.patch
# stop so many build warnings
Patch506: chromium-71.0.3578.94-quieten.patch
Patch507: chromium-trace.patch
+Patch508: chromium-74.0.3729.108-revert_values.patch
+Patch509: trace_fix.patch
+
Provides: %{crname}
Obsoletes: chromium-browser-unstable < 26.0.1410.51
Obsoletes: chromium-browser-beta < 26.0.1410.51
@@ -336,11 +344,9 @@ python2 build/linux/unbundle/remove_bundled_libraries.py \
'base/third_party/xdg_user_dirs' \
'chrome/third_party/mozilla_security_manager' \
'courgette/third_party' \
- 'net/third_party/http2' \
'net/third_party/mozilla_security_manager' \
'net/third_party/nss' \
'net/third_party/quic' \
- 'net/third_party/spdy' \
'net/third_party/uri_template' \
'third_party/abseil-cpp' \
'third_party/adobe' \
@@ -387,8 +393,10 @@ python2 build/linux/unbundle/remove_bundled_libraries.py \
'third_party/crashpad/crashpad/third_party/zlib/' \
'third_party/crc32c' \
'third_party/cros_system_api' \
+ 'third_party/dav1d' \
'third_party/devscripts' \
'third_party/dom_distiller_js' \
+ 'third_party/emoji-segmenter' \
'third_party/expat' \
'third_party/ffmpeg' \
'third_party/fips181' \
@@ -397,6 +405,7 @@ python2 build/linux/unbundle/remove_bundled_libraries.py \
'third_party/flot' \
'third_party/fontconfig' \
'third_party/freetype' \
+ 'third_party/glslang' \
'third_party/google_input_tools' \
'third_party/google_input_tools/third_party/closure_library' \
'third_party/google_input_tools/third_party/closure_library/third_party/closure' \
@@ -441,6 +450,7 @@ python2 build/linux/unbundle/remove_bundled_libraries.py \
'third_party/mesa' \
'third_party/metrics_proto' \
'third_party/modp_b64' \
+ 'third_party/nasm' \
'third_party/node' \
'third_party/node/node_modules/polymer-bundler/lib/third_party/UglifyJS2' \
'third_party/openh264' \
@@ -472,6 +482,7 @@ python2 build/linux/unbundle/remove_bundled_libraries.py \
'third_party/simplejson' \
'third_party/sinonjs' \
'third_party/skia' \
+ 'third_party/skia/include/third_party/vulkan' \
'third_party/skia/third_party/gif' \
'third_party/skia/third_party/skcms' \
'third_party/skia/third_party/vulkan' \
@@ -508,6 +519,7 @@ python2 build/linux/unbundle/remove_bundled_libraries.py \
'third_party/zlib/google' \
'tools/gn/base/third_party/icu' \
'url/third_party/mozilla' \
+ 'v8/src/third_party/siphash' \
'v8/src/third_party/utf8-decoder' \
'v8/src/third_party/valgrind' \
'v8/third_party/v8' \
@@ -535,6 +547,9 @@ export PATH=$PWD/bfd:$PATH
%global ldflags %{ldflags} -fuse-ld=bfd -Wl,--no-keep-memory -Wl,--reduce-memory-overheads
%endif
+# cb chromium 74 fails with malformed archive at link stage if ulimit not increased
+ulimit -n 4096
+
export CC=gcc
export CXX=g++
diff --git a/move-required.patch b/move-required.patch
new file mode 100644
index 0000000..3814c72
--- /dev/null
+++ b/move-required.patch
@@ -0,0 +1,124 @@
+description: gcc 6 needs an explicit hint that these objects should be moved
+author: Michael Gilbert <mgilbert@debian.org>
+
+--- a/extensions/browser/api/declarative_webrequest/webrequest_action.cc
++++ b/extensions/browser/api/declarative_webrequest/webrequest_action.cc
+@@ -578,7 +578,7 @@ base::Optional<EventResponseDelta> WebRe
+ CHECK(request_data.stage & stages());
+ EventResponseDelta result(extension_id, extension_install_time);
+ result.cancel = true;
+- return result;
++ return std::move(result);
+ }
+
+ //
+@@ -613,7 +613,7 @@ base::Optional<EventResponseDelta> WebRe
+ return base::nullopt;
+ EventResponseDelta result(extension_id, extension_install_time);
+ result.new_url = redirect_url_;
+- return result;
++ return std::move(result);
+ }
+
+ //
+@@ -642,7 +642,7 @@ WebRequestRedirectToTransparentImageActi
+ CHECK(request_data.stage & stages());
+ EventResponseDelta result(extension_id, extension_install_time);
+ result.new_url = GURL(kTransparentImageUrl);
+- return result;
++ return std::move(result);
+ }
+
+ //
+@@ -671,7 +671,7 @@ WebRequestRedirectToEmptyDocumentAction:
+ CHECK(request_data.stage & stages());
+ EventResponseDelta result(extension_id, extension_install_time);
+ result.new_url = GURL(kEmptyDocumentUrl);
+- return result;
++ return std::move(result);
+ }
+
+ //
+@@ -773,7 +773,7 @@ base::Optional<EventResponseDelta> WebRe
+
+ EventResponseDelta result(extension_id, extension_install_time);
+ result.new_url = GURL(new_url);
+- return result;
++ return std::move(result);
+ }
+
+ //
+@@ -813,7 +813,7 @@ WebRequestSetRequestHeaderAction::Create
+ CHECK(request_data.stage & stages());
+ EventResponseDelta result(extension_id, extension_install_time);
+ result.modified_request_headers.SetHeader(name_, value_);
+- return result;
++ return std::move(result);
+ }
+
+ //
+@@ -851,7 +851,7 @@ WebRequestRemoveRequestHeaderAction::Cre
+ CHECK(request_data.stage & stages());
+ EventResponseDelta result(extension_id, extension_install_time);
+ result.deleted_request_headers.push_back(name_);
+- return result;
++ return std::move(result);
+ }
+
+ //
+@@ -900,7 +900,7 @@ WebRequestAddResponseHeaderAction::Creat
+
+ EventResponseDelta result(extension_id, extension_install_time);
+ result.added_response_headers.push_back(make_pair(name_, value_));
+- return result;
++ return std::move(result);
+ }
+
+ //
+@@ -954,7 +954,7 @@ WebRequestRemoveResponseHeaderAction::Cr
+ continue;
+ result.deleted_response_headers.push_back(make_pair(name_, current_value));
+ }
+- return result;
++ return std::move(result);
+ }
+
+ //
+@@ -1039,7 +1039,7 @@ base::Optional<EventResponseDelta> WebRe
+ EventResponseDelta result(extension_id, extension_install_time);
+ result.request_cookie_modifications.push_back(
+ request_cookie_modification_.Clone());
+- return result;
++ return std::move(result);
+ }
+
+ //
+@@ -1087,7 +1087,7 @@ base::Optional<EventResponseDelta> WebRe
+ EventResponseDelta result(extension_id, extension_install_time);
+ result.response_cookie_modifications.push_back(
+ response_cookie_modification_.Clone());
+- return result;
++ return std::move(result);
+ }
+
+ //
+@@ -1127,7 +1127,7 @@ WebRequestSendMessageToExtensionAction::
+ CHECK(request_data.stage & stages());
+ EventResponseDelta result(extension_id, extension_install_time);
+ result.messages_to_extension.insert(message_);
+- return result;
++ return std::move(result);
+ }
+
+ } // namespace extensions
+--- a/device/fido/pin.cc
++++ b/device/fido/pin.cc
+@@ -129,7 +129,7 @@ base::Optional<bssl::UniquePtr<EC_POINT>
+ return base::nullopt;
+ }
+
+- return ret;
++ return std::move(ret);
+ }
+
+ // static
diff --git a/not-constexpr.patch b/not-constexpr.patch
new file mode 100644
index 0000000..66f8189
--- /dev/null
+++ b/not-constexpr.patch
@@ -0,0 +1,184 @@
+description: remove constexpr from methods where it is not supported by gcc 6
+author: Michael Gilbert <mgilbert@debian.org>
+
+--- a/base/test/scoped_task_environment.h
++++ b/base/test/scoped_task_environment.h
+@@ -211,11 +211,11 @@ class ScopedTaskEnvironment {
+ protected:
+ explicit ScopedTaskEnvironment(ScopedTaskEnvironment&& other);
+
+- constexpr MainThreadType main_thread_type() const {
++ const MainThreadType main_thread_type() const {
+ return main_thread_type_;
+ }
+
+- constexpr ExecutionMode execution_control_mode() const {
++ const ExecutionMode execution_control_mode() const {
+ return execution_control_mode_;
+ }
+
+--- a/gpu/command_buffer/client/transfer_buffer_cmd_copy_helpers.h
++++ b/gpu/command_buffer/client/transfer_buffer_cmd_copy_helpers.h
+@@ -13,7 +13,7 @@ namespace gpu {
+
+ // Sum the sizes of the types in Ts as CheckedNumeric<T>.
+ template <typename T, typename... Ts>
+-constexpr base::CheckedNumeric<T> CheckedSizeOfPackedTypes() {
++base::CheckedNumeric<T> CheckedSizeOfPackedTypes() {
+ static_assert(sizeof...(Ts) > 0, "");
+ base::CheckedNumeric<T> checked_elements_size = 0;
+ for (size_t s : {sizeof(Ts)...}) {
+@@ -87,10 +87,9 @@ auto CopyArraysToBuffer(uint32_t count,
+ // Sum the sizes of the types in Ts. This will fail to compile if the result
+ // does not fit in T.
+ template <typename T, typename... Ts>
+-constexpr T SizeOfPackedTypes() {
+- constexpr base::CheckedNumeric<T> checked_elements_size =
++T SizeOfPackedTypes() {
++ base::CheckedNumeric<T> checked_elements_size =
+ CheckedSizeOfPackedTypes<T, Ts...>();
+- static_assert(checked_elements_size.IsValid(), "");
+ return checked_elements_size.ValueOrDie();
+ }
+
+@@ -113,7 +112,7 @@ template <typename... Ts>
+ constexpr uint32_t ComputeMaxCopyCount(uint32_t buffer_size) {
+ // Start by tightly packing the elements and decrease copy_count until
+ // the total aligned copy size fits
+- constexpr uint32_t elements_size = SizeOfPackedTypes<uint32_t, Ts...>();
++ uint32_t elements_size = SizeOfPackedTypes<uint32_t, Ts...>();
+ uint32_t copy_count = buffer_size / elements_size;
+
+ while (copy_count > 0) {
+--- a/media/filters/jpeg_parser.cc
++++ b/media/filters/jpeg_parser.cc
+@@ -91,13 +91,13 @@ const JpegHuffmanTable kDefaultAcTable[k
+ },
+ };
+
+-constexpr uint8_t kZigZag8x8[64] = {
++const uint8_t kZigZag8x8[64] = {
+ 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5,
+ 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28,
+ 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51,
+ 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63};
+
+-constexpr JpegQuantizationTable kDefaultQuantTable[2] = {
++const JpegQuantizationTable kDefaultQuantTable[2] = {
+ // Table K.1 Luminance quantization table values.
+ {
+ true,
+--- a/media/gpu/vaapi/vaapi_jpeg_encoder.cc
++++ b/media/gpu/vaapi/vaapi_jpeg_encoder.cc
+@@ -51,7 +51,7 @@ void FillQMatrix(VAQMatrixBufferJPEG* q_
+ // Fill the raw, unscaled quantization tables for libva. The VAAPI driver is
+ // responsible for scaling the quantization tables based on picture
+ // parameter quality.
+- const JpegQuantizationTable& luminance = kDefaultQuantTable[0];
++ const JpegQuantizationTable luminance = kDefaultQuantTable[0];
+ static_assert(std::extent<decltype(luminance.value)>() ==
+ std::extent<decltype(q_matrix->lum_quantiser_matrix)>(),
+ "Luminance quantization table size mismatch.");
+@@ -62,7 +62,7 @@ void FillQMatrix(VAQMatrixBufferJPEG* q_
+ q_matrix->lum_quantiser_matrix[i] = luminance.value[kZigZag8x8[i]];
+ }
+
+- const JpegQuantizationTable& chrominance = kDefaultQuantTable[1];
++ const JpegQuantizationTable chrominance = kDefaultQuantTable[1];
+ static_assert(std::extent<decltype(chrominance.value)>() ==
+ std::extent<decltype(q_matrix->chroma_quantiser_matrix)>(),
+ "Chrominance quantization table size mismatch.");
+--- a/content/public/test/test_browser_thread_bundle.h
++++ b/content/public/test/test_browser_thread_bundle.h
+@@ -175,7 +175,7 @@ class TestBrowserThreadBundle : public b
+ return *options == Options::REAL_IO_THREAD;
+ }
+
+- constexpr bool HasIOMainLoop() const {
++ const bool HasIOMainLoop() const {
+ return main_thread_type() == MainThreadType::IO ||
+ main_thread_type() == MainThreadType::IO_MOCK_TIME;
+ }
+--- a/base/trace_event/trace_arguments.h
++++ b/base/trace_event/trace_arguments.h
+@@ -490,21 +490,21 @@ class BASE_EXPORT StringStorage {
+ void Reset(size_t alloc_size = 0);
+
+ // Accessors.
+- constexpr size_t size() const { return data_ ? data_->size : 0u; }
+- constexpr const char* data() const { return data_ ? data_->chars : nullptr; }
+- constexpr char* data() { return data_ ? data_->chars : nullptr; }
++ size_t size() const { return data_ ? data_->size : 0u; }
++ const char* data() const { return data_ ? data_->chars : nullptr; }
++ char* data() { return data_ ? data_->chars : nullptr; }
+
+- constexpr const char* begin() const { return data(); }
+- constexpr const char* end() const { return data() + size(); }
++ const char* begin() const { return data(); }
++ const char* end() const { return data() + size(); }
+ inline char* begin() { return data(); }
+ inline char* end() { return data() + size(); }
+
+ // True iff storage is empty.
+- constexpr bool empty() const { return size() == 0; }
++ bool empty() const { return size() == 0; }
+
+ // Returns true if |ptr| is inside the storage area, false otherwise.
+ // Used during unit-testing.
+- constexpr bool Contains(const void* ptr) const {
++ bool Contains(const void* ptr) const {
+ const char* char_ptr = static_cast<const char*>(ptr);
+ return (char_ptr >= begin() && char_ptr < end());
+ }
+@@ -515,7 +515,7 @@ class BASE_EXPORT StringStorage {
+
+ // Return an estimate of the memory overhead of this instance. This doesn't
+ // count the size of |data_| itself.
+- constexpr size_t EstimateTraceMemoryOverhead() const {
++ size_t EstimateTraceMemoryOverhead() const {
+ return data_ ? sizeof(size_t) + data_->size : 0u;
+ }
+
+--- a/content/public/browser/desktop_media_id.h
++++ b/content/public/browser/desktop_media_id.h
+@@ -37,16 +37,16 @@ struct CONTENT_EXPORT DesktopMediaID {
+ static gfx::NativeWindow GetNativeWindowById(const DesktopMediaID& id);
+ #endif // USE_AURA
+
+- constexpr DesktopMediaID() = default;
++ DesktopMediaID() = default;
+
+- constexpr DesktopMediaID(Type type, Id id) : type(type), id(id) {}
++ DesktopMediaID(Type type, Id id) : type(type), id(id) {}
+
+- constexpr DesktopMediaID(Type type,
++ DesktopMediaID(Type type,
+ Id id,
+ WebContentsMediaCaptureId web_contents_id)
+ : type(type), id(id), web_contents_id(web_contents_id) {}
+
+- constexpr DesktopMediaID(Type type, Id id, bool audio_share)
++ DesktopMediaID(Type type, Id id, bool audio_share)
+ : type(type), id(id), audio_share(audio_share) {}
+
+ // Operators so that DesktopMediaID can be used with STL containers.
+--- a/base/containers/any_internal.h
++++ b/base/containers/any_internal.h
+@@ -45,7 +45,7 @@ class BASE_EXPORT AnyInternal {
+ type_ops_ = other.type_ops_;
+ }
+
+- constexpr bool has_value() const noexcept { return !!type_ops_; }
++ const bool has_value() const noexcept { return !!type_ops_; }
+
+ TypeId type() const noexcept {
+ if (!type_ops_)
+@@ -160,7 +160,7 @@ class BASE_EXPORT AnyInternal {
+
+ // static
+ template <typename T>
+-const AnyInternal::TypeOps AnyInternal::TypeOpsHelper<T>::type_ops;
++constexpr AnyInternal::TypeOps AnyInternal::TypeOpsHelper<T>::type_ops;
+
+ template <typename T>
+ struct AnyInternal::ConstructHelper<T, /* UseInlineStorage */ true> {
diff --git a/quic.patch b/quic.patch
new file mode 100644
index 0000000..03b314b
--- /dev/null
+++ b/quic.patch
@@ -0,0 +1,154 @@
+description: fix gcc compile error with substreams_ initializer list
+author: Michael Gilbert <mgilbert@debian.org>
+
+--- a/net/third_party/quic/core/quic_crypto_stream.cc
++++ b/net/third_party/quic/core/quic_crypto_stream.cc
+@@ -28,9 +28,9 @@ QuicCryptoStream::QuicCryptoStream(QuicS
+ session,
+ /*is_static=*/true,
+ BIDIRECTIONAL),
+- substreams_{{this, ENCRYPTION_NONE},
+- {this, ENCRYPTION_ZERO_RTT},
+- {this, ENCRYPTION_FORWARD_SECURE}} {
++ substreams_{std::make_unique<CryptoSubstream>(this, ENCRYPTION_NONE),
++ std::make_unique<CryptoSubstream>(this, ENCRYPTION_ZERO_RTT),
++ std::make_unique<CryptoSubstream>(this, ENCRYPTION_FORWARD_SECURE)} {
+ // The crypto stream is exempt from connection level flow control.
+ DisableConnectionFlowControlForThisStream();
+ }
+@@ -57,7 +57,7 @@ void QuicCryptoStream::OnCryptoFrame(con
+ QUIC_BUG_IF(session()->connection()->transport_version() < QUIC_VERSION_47)
+ << "Versions less than 47 shouldn't receive CRYPTO frames";
+ EncryptionLevel level = session()->connection()->last_decrypted_level();
+- substreams_[level].sequencer.OnCryptoFrame(frame);
++ substreams_[level]->sequencer.OnCryptoFrame(frame);
+ }
+
+ void QuicCryptoStream::OnStreamFrame(const QuicStreamFrame& frame) {
+@@ -79,7 +79,7 @@ void QuicCryptoStream::OnDataAvailable()
+ OnDataAvailableInSequencer(sequencer(), level);
+ return;
+ }
+- OnDataAvailableInSequencer(&substreams_[level].sequencer, level);
++ OnDataAvailableInSequencer(&substreams_[level]->sequencer, level);
+ }
+
+ void QuicCryptoStream::OnDataAvailableInSequencer(
+@@ -133,7 +133,7 @@ void QuicCryptoStream::WriteCryptoData(E
+ }
+ // Append |data| to the send buffer for this encryption level.
+ struct iovec iov(QuicUtils::MakeIovec(data));
+- QuicStreamSendBuffer* send_buffer = &substreams_[level].send_buffer;
++ QuicStreamSendBuffer* send_buffer = &substreams_[level]->send_buffer;
+ QuicStreamOffset offset = send_buffer->stream_offset();
+ send_buffer->SaveStreamData(&iov, /*iov_count=*/1, /*iov_offset=*/0,
+ data.length());
+@@ -160,7 +160,7 @@ void QuicCryptoStream::OnSuccessfulVersi
+ bool QuicCryptoStream::OnCryptoFrameAcked(const QuicCryptoFrame& frame,
+ QuicTime::Delta ack_delay_time) {
+ QuicByteCount newly_acked_length = 0;
+- if (!substreams_[frame.level].send_buffer.OnStreamDataAcked(
++ if (!substreams_[frame.level]->send_buffer.OnStreamDataAcked(
+ frame.offset, frame.data_length, &newly_acked_length)) {
+ CloseConnectionWithDetails(QUIC_INTERNAL_ERROR,
+ "Trying to ack unsent crypto data.");
+@@ -178,7 +178,7 @@ void QuicCryptoStream::NeuterUnencrypted
+ }
+ return;
+ }
+- QuicStreamSendBuffer* send_buffer = &substreams_[ENCRYPTION_NONE].send_buffer;
++ QuicStreamSendBuffer* send_buffer = &substreams_[ENCRYPTION_NONE]->send_buffer;
+ // TODO(nharper): Consider adding a Clear() method to QuicStreamSendBuffer to
+ // replace the following code.
+ QuicIntervalSet<QuicStreamOffset> to_ack = send_buffer->bytes_acked();
+@@ -207,7 +207,7 @@ bool QuicCryptoStream::HasPendingCryptoR
+ }
+ for (EncryptionLevel level :
+ {ENCRYPTION_NONE, ENCRYPTION_ZERO_RTT, ENCRYPTION_FORWARD_SECURE}) {
+- if (substreams_[level].send_buffer.HasPendingRetransmission()) {
++ if (substreams_[level]->send_buffer.HasPendingRetransmission()) {
+ return true;
+ }
+ }
+@@ -221,7 +221,7 @@ void QuicCryptoStream::WritePendingCrypt
+ session()->connection()->encryption_level();
+ for (EncryptionLevel level :
+ {ENCRYPTION_NONE, ENCRYPTION_ZERO_RTT, ENCRYPTION_FORWARD_SECURE}) {
+- QuicStreamSendBuffer* send_buffer = &substreams_[level].send_buffer;
++ QuicStreamSendBuffer* send_buffer = &substreams_[level]->send_buffer;
+ session()->connection()->SetDefaultEncryptionLevel(level);
+ while (send_buffer->HasPendingRetransmission()) {
+ auto pending = send_buffer->NextPendingRetransmission();
+@@ -326,13 +326,13 @@ uint64_t QuicCryptoStream::crypto_bytes_
+ if (session()->connection()->transport_version() < QUIC_VERSION_47) {
+ return stream_bytes_read();
+ }
+- return substreams_[ENCRYPTION_NONE].sequencer.NumBytesConsumed() +
+- substreams_[ENCRYPTION_ZERO_RTT].sequencer.NumBytesConsumed() +
+- substreams_[ENCRYPTION_FORWARD_SECURE].sequencer.NumBytesConsumed();
++ return substreams_[ENCRYPTION_NONE]->sequencer.NumBytesConsumed() +
++ substreams_[ENCRYPTION_ZERO_RTT]->sequencer.NumBytesConsumed() +
++ substreams_[ENCRYPTION_FORWARD_SECURE]->sequencer.NumBytesConsumed();
+ }
+
+ uint64_t QuicCryptoStream::BytesReadOnLevel(EncryptionLevel level) const {
+- return substreams_[level].sequencer.NumBytesConsumed();
++ return substreams_[level]->sequencer.NumBytesConsumed();
+ }
+
+ bool QuicCryptoStream::WriteCryptoFrame(EncryptionLevel level,
+@@ -341,14 +341,14 @@ bool QuicCryptoStream::WriteCryptoFrame(
+ QuicDataWriter* writer) {
+ QUIC_BUG_IF(session()->connection()->transport_version() < QUIC_VERSION_47)
+ << "Versions less than 47 don't write CRYPTO frames (2)";
+- return substreams_[level].send_buffer.WriteStreamData(offset, data_length,
++ return substreams_[level]->send_buffer.WriteStreamData(offset, data_length,
+ writer);
+ }
+
+ void QuicCryptoStream::OnCryptoFrameLost(QuicCryptoFrame* crypto_frame) {
+ QUIC_BUG_IF(session()->connection()->transport_version() < QUIC_VERSION_47)
+ << "Versions less than 47 don't lose CRYPTO frames";
+- substreams_[crypto_frame->level].send_buffer.OnStreamDataLost(
++ substreams_[crypto_frame->level]->send_buffer.OnStreamDataLost(
+ crypto_frame->offset, crypto_frame->data_length);
+ }
+
+@@ -358,7 +358,7 @@ void QuicCryptoStream::RetransmitData(Qu
+ QuicIntervalSet<QuicStreamOffset> retransmission(
+ crypto_frame->offset, crypto_frame->offset + crypto_frame->data_length);
+ QuicStreamSendBuffer* send_buffer =
+- &substreams_[crypto_frame->level].send_buffer;
++ &substreams_[crypto_frame->level]->send_buffer;
+ retransmission.Difference(send_buffer->bytes_acked());
+ if (retransmission.Empty()) {
+ return;
+@@ -389,7 +389,7 @@ bool QuicCryptoStream::IsFrameOutstandin
+ // the wrong transport version.
+ return false;
+ }
+- return substreams_[level].send_buffer.IsStreamDataOutstanding(offset, length);
++ return substreams_[level]->send_buffer.IsStreamDataOutstanding(offset, length);
+ }
+
+ bool QuicCryptoStream::IsWaitingForAcks() const {
+@@ -398,7 +398,7 @@ bool QuicCryptoStream::IsWaitingForAcks(
+ }
+ for (EncryptionLevel level :
+ {ENCRYPTION_NONE, ENCRYPTION_ZERO_RTT, ENCRYPTION_FORWARD_SECURE}) {
+- if (substreams_[level].send_buffer.stream_bytes_outstanding()) {
++ if (substreams_[level]->send_buffer.stream_bytes_outstanding()) {
+ return true;
+ }
+ }
+--- a/net/third_party/quic/core/quic_crypto_stream.h
++++ b/net/third_party/quic/core/quic_crypto_stream.h
+@@ -166,7 +166,7 @@ class QUIC_EXPORT_PRIVATE QuicCryptoStre
+
+ // Keeps state for data sent/received in CRYPTO frames at each encryption
+ // level.
+- CryptoSubstream substreams_[NUM_ENCRYPTION_LEVELS];
++ std::unique_ptr<CryptoSubstream> substreams_[NUM_ENCRYPTION_LEVELS];
+ };
+
+ } // namespace quic
diff --git a/trace_fix.patch b/trace_fix.patch
new file mode 100644
index 0000000..3e5f24a
--- /dev/null
+++ b/trace_fix.patch
@@ -0,0 +1,55 @@
+--- chromium-74.0.3729.108/chrome/browser/tracing/trace_event_system_stats_monitor.cc.orig 2019-04-29 23:28:08.069667734 +0100
++++ chromium-74.0.3729.108/chrome/browser/tracing/trace_event_system_stats_monitor.cc 2019-04-29 23:32:49.165649758 +0100
+@@ -84,8 +84,10 @@
+ is_profiling_ = true;
+ DCHECK(performance_monitor::SystemMonitor::Get());
+ performance_monitor::SystemMonitor::Get()->AddOrUpdateObserver(
+- this, {.system_metrics_sampling_frequency =
+- SamplingFrequency::kDefaultFrequency});
++ this, {.free_phys_memory_mb_frequency = SamplingFrequency::kNoSampling,
++ .disk_idle_time_percent_frequency = SamplingFrequency::kNoSampling,
++ .system_metrics_sampling_frequency =
++ SamplingFrequency::kDefaultFrequency });
+ }
+
+ void TraceEventSystemStatsMonitor::OnSystemMetricsStruct(
+--- chromium-74.0.3729.108/third_party/blink/renderer/platform/scheduler/common/web_thread_scheduler.cc.orig 2019-04-30 20:59:43.952010258 +0100
++++ chromium-74.0.3729.108/third_party/blink/renderer/platform/scheduler/common/web_thread_scheduler.cc 2019-04-30 21:04:19.495197612 +0100
+@@ -21,7 +21,10 @@
+ std::unique_ptr<base::MessagePump> message_pump,
+ base::Optional<base::Time> initial_virtual_time) {
+ auto settings = base::sequence_manager::SequenceManager::Settings{
+- .randomised_sampling_enabled = true};
++ .message_loop_type = base::MessageLoop::Type::TYPE_DEFAULT,
++ .randomised_sampling_enabled = true,
++ .clock = base::DefaultTickClock::GetInstance()
++ };
+ auto sequence_manager =
+ message_pump
+ ? base::sequence_manager::
+--- chromium-74.0.3729.108/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_impl.cc.orig 2019-04-30 22:38:11.355427414 +0100
++++ chromium-74.0.3729.108/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_impl.cc 2019-04-30 22:39:02.667424133 +0100
+@@ -28,7 +28,9 @@
+ thread_type,
+ base::sequence_manager::CreateSequenceManagerOnCurrentThread(
+ base::sequence_manager::SequenceManager::Settings{
+- .randomised_sampling_enabled = true}),
++ .message_loop_type = base::MessageLoop::Type::TYPE_DEFAULT,
++ .randomised_sampling_enabled = true,
++ .clock = base::DefaultTickClock::GetInstance()}),
+ proxy);
+ }
+
+--- chromium-74.0.3729.108/third_party/blink/renderer/platform/scheduler/worker/compositor_thread.cc.orig 2019-04-30 22:48:34.180387586 +0100
++++ chromium-74.0.3729.108/third_party/blink/renderer/platform/scheduler/worker/compositor_thread.cc 2019-04-30 22:49:39.043383438 +0100
+@@ -20,7 +20,9 @@
+ return std::make_unique<CompositorThreadScheduler>(
+ base::sequence_manager::CreateSequenceManagerOnCurrentThread(
+ base::sequence_manager::SequenceManager::Settings{
+- .randomised_sampling_enabled = true}));
++ .message_loop_type = base::MessageLoop::Type::TYPE_DEFAULT,
++ .randomised_sampling_enabled = true,
++ .clock = base::DefaultTickClock::GetInstance()}));
+ }
+
+ } // namespace scheduler