blob: d3bbf7081397550e5ba4e2df93ab64a00cb0dd08 [file] [log] [blame]
pbos@webrtc.orgaf8d5af2013-07-09 08:02:331/*
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
Florent Castelli8037fc62024-08-29 13:00:4010#include <optional>
Yves Gerey3e707812018-11-28 15:47:4911#include <string>
Yves Gerey3e707812018-11-28 15:47:4912#include <vector>
pbos@webrtc.orgaf8d5af2013-07-09 08:02:3313
Mirko Bonadei2ab97f62019-07-18 11:44:1214#include "absl/flags/flag.h"
Philipp Hancke94db4c42025-05-06 20:55:1315#include "api/rtp_parameters.h"
Yves Gerey3e707812018-11-28 15:47:4916#include "api/test/simulated_network.h"
Yves Gerey3e707812018-11-28 15:47:4917#include "api/test/video_quality_test_fixture.h"
Per K5566b912024-05-15 15:53:0218#include "api/units/data_rate.h"
Yves Gerey3e707812018-11-28 15:47:4919#include "api/video_codecs/sdp_video_format.h"
Philipp Hancke94db4c42025-05-06 20:55:1320#include "api/video_codecs/spatial_layer.h"
Yves Gerey3e707812018-11-28 15:47:4921#include "api/video_codecs/video_codec.h"
Johannes Kronc3fcee72021-04-19 07:09:2622#include "api/video_codecs/vp9_profile.h"
Emircan Uysaler0823eec2018-07-14 00:10:0023#include "modules/video_coding/codecs/vp9/include/vp9.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3124#include "test/gtest.h"
Rasmus Brandt3c589be2019-03-13 10:32:4025#include "test/testsupport/file_utils.h"
Jonas Oreland6c2dae22022-09-29 08:28:2426#include "video/config/video_encoder_config.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3127#include "video/video_quality_test.h"
pbos@webrtc.orgaf8d5af2013-07-09 08:02:3328
Mirko Bonadei2ab97f62019-07-18 11:44:1229ABSL_FLAG(std::string,
30 rtc_event_log_name,
31 "",
32 "Filename for rtc event log. Two files "
33 "with \"_send\" and \"_recv\" suffixes will be created.");
34ABSL_FLAG(std::string,
35 rtp_dump_name,
36 "",
37 "Filename for dumped received RTP stream.");
38ABSL_FLAG(std::string,
39 encoded_frame_path,
40 "",
41 "The base path for encoded frame logs. Created files will have "
42 "the form <encoded_frame_path>.<n>.(recv|send.<m>).ivf");
Sebastian Janssonf8518882018-05-31 12:52:5943
44namespace webrtc {
pbos@webrtc.orgaf8d5af2013-07-09 08:02:3345
sprang89c4a7e2017-06-30 20:27:4046namespace {
Philipp Hancke2eca9592025-06-13 21:26:5547const int kFullStackTestDurationSecs = 45;
pbos@webrtc.orgb613b5a2013-12-03 10:13:0448
Patrik Höglundb6b29e02018-06-21 14:58:0149struct ParamsWithLogging : public VideoQualityTest::Params {
pbos@webrtc.orgaf8d5af2013-07-09 08:02:3350 public:
Patrik Höglundb6b29e02018-06-21 14:58:0151 ParamsWithLogging() {
52 // Use these logging flags by default, for everything.
Mirko Bonadei2ab97f62019-07-18 11:44:1253 logging = {absl::GetFlag(FLAGS_rtc_event_log_name),
54 absl::GetFlag(FLAGS_rtp_dump_name),
55 absl::GetFlag(FLAGS_encoded_frame_path)};
Artem Titov75e36472018-10-08 10:28:5656 this->config = BuiltInNetworkBehaviorConfig();
pbos@webrtc.org94015242013-10-16 11:05:3757 }
pbos@webrtc.orgaf8d5af2013-07-09 08:02:3358};
59
Rasmus Brandt3c589be2019-03-13 10:32:4060std::string ClipNameToClipPath(const char* clip_name) {
61 return test::ResourcePath(clip_name, "yuv");
62}
Patrik Höglundb6b29e02018-06-21 14:58:0163} // namespace
64
sprangce4aef12015-11-02 15:23:2065// VideoQualityTest::Params params = {
66// { ... }, // Common.
67// { ... }, // Video-specific settings.
68// { ... }, // Screenshare-specific settings.
69// { ... }, // Analyzer settings.
70// pipe, // FakeNetworkPipe::Config
71// { ... }, // Spatial scalability.
72// logs // bool
73// };
pbos@webrtc.orgaf8d5af2013-07-09 08:02:3374
Mirko Bonadei8ef57932018-11-16 13:38:0375#if defined(RTC_ENABLE_VP9)
Jeremy Lecontec8850cb2020-09-10 18:46:3376TEST(FullStackTest, Foreman_Cif_Net_Delay_0_0_Plr_0_VP9) {
Danil Chapovalovbeddb152025-06-16 16:25:1077 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:0178 ParamsWithLogging foreman_cif;
brandtr93c5d032016-11-30 15:50:0779 foreman_cif.call.send_side_bwe = true;
Rasmus Brandt3c589be2019-03-13 10:32:4080 foreman_cif.video[0] = {
81 true, 352, 288, 30,
82 700000, 700000, 700000, false,
83 "VP9", 1, 0, 0,
84 false, false, true, ClipNameToClipPath("foreman_cif")};
brandtr93c5d032016-11-30 15:50:0785 foreman_cif.analyzer = {"foreman_cif_net_delay_0_0_plr_0_VP9", 0.0, 0.0,
86 kFullStackTestDurationSecs};
Danil Chapovalovbeddb152025-06-16 16:25:1087 fixture.RunWithAnalyzer(foreman_cif);
asapersson88b0a222016-02-12 21:16:4388}
89
Jeremy Lecontec8850cb2020-09-10 18:46:3390TEST(GenericDescriptorTest,
91 Foreman_Cif_Delay_50_0_Plr_5_VP9_Generic_Descriptor) {
Danil Chapovalovbeddb152025-06-16 16:25:1092 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:0193 ParamsWithLogging foreman_cif;
brandtr93c5d032016-11-30 15:50:0794 foreman_cif.call.send_side_bwe = true;
Rasmus Brandt3c589be2019-03-13 10:32:4095 foreman_cif.video[0] = {
96 true, 352, 288, 30,
97 30000, 500000, 2000000, false,
98 "VP9", 1, 0, 0,
99 false, false, true, ClipNameToClipPath("foreman_cif")};
Danil Chapovalov636865e2020-06-03 12:11:26100 foreman_cif.analyzer = {"foreman_cif_delay_50_0_plr_5_VP9_generic_descriptor",
101 0.0, 0.0, kFullStackTestDurationSecs};
Artem Titovf18b3522018-08-28 14:54:24102 foreman_cif.config->loss_percent = 5;
103 foreman_cif.config->queue_delay_ms = 50;
Danil Chapovalov636865e2020-06-03 12:11:26104 foreman_cif.call.generic_descriptor = true;
Danil Chapovalovbeddb152025-06-16 16:25:10105 fixture.RunWithAnalyzer(foreman_cif);
asapersson88b0a222016-02-12 21:16:43106}
Emircan Uysaler03e6ec92018-03-09 23:03:26107
Jeremy Lecontec8850cb2020-09-10 18:46:33108TEST(FullStackTest, Generator_Net_Delay_0_0_Plr_0_VP9Profile2) {
Emircan Uysaler0823eec2018-07-14 00:10:00109 // Profile 2 might not be available on some platforms until
110 // https://bugs.chromium.org/p/webm/issues/detail?id=1544 is solved.
111 bool profile_2_is_supported = false;
112 for (const auto& codec : SupportedVP9Codecs()) {
113 if (ParseSdpForVP9Profile(codec.parameters)
114 .value_or(VP9Profile::kProfile0) == VP9Profile::kProfile2) {
115 profile_2_is_supported = true;
116 }
117 }
118 if (!profile_2_is_supported)
119 return;
Danil Chapovalovbeddb152025-06-16 16:25:10120 VideoQualityTest fixture;
Emircan Uysaler0823eec2018-07-14 00:10:00121
Philipp Hanckede172522023-12-14 08:45:39122 CodecParameterMap vp92 = {
Emircan Uysaler0823eec2018-07-14 00:10:00123 {kVP9FmtpProfileId, VP9ProfileToString(VP9Profile::kProfile2)}};
124 ParamsWithLogging generator;
125 generator.call.send_side_bwe = true;
126 generator.video[0] = {
127 true, 352, 288, 30, 700000, 700000, 700000, false, "VP9",
Stefan Holmer1f7a0082019-01-11 14:39:08128 1, 0, 0, false, false, true, "GeneratorI010", 0, vp92};
Emircan Uysaler0823eec2018-07-14 00:10:00129 generator.analyzer = {"generator_net_delay_0_0_plr_0_VP9Profile2", 0.0, 0.0,
130 kFullStackTestDurationSecs};
Danil Chapovalovbeddb152025-06-16 16:25:10131 fixture.RunWithAnalyzer(generator);
Emircan Uysaler0823eec2018-07-14 00:10:00132}
133
Mirko Bonadei8ef57932018-11-16 13:38:03134#endif // defined(RTC_ENABLE_VP9)
asapersson88b0a222016-02-12 21:16:43135
Patrik Höglund11bf2fa2018-04-09 10:20:50136#if defined(WEBRTC_LINUX)
137// Crashes on the linux trusty perf bot: bugs.webrtc.org/9129.
Jeremy Lecontec8850cb2020-09-10 18:46:33138#define MAYBE_Net_Delay_0_0_Plr_0 DISABLED_Net_Delay_0_0_Plr_0
Patrik Höglund11bf2fa2018-04-09 10:20:50139#else
Jeremy Lecontec8850cb2020-09-10 18:46:33140#define MAYBE_Net_Delay_0_0_Plr_0 Net_Delay_0_0_Plr_0
Patrik Höglund11bf2fa2018-04-09 10:20:50141#endif
Jeremy Lecontec8850cb2020-09-10 18:46:33142TEST(FullStackTest, MAYBE_Net_Delay_0_0_Plr_0) {
Danil Chapovalovbeddb152025-06-16 16:25:10143 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:01144 ParamsWithLogging paris_qcif;
minyue626bc952016-10-31 12:47:02145 paris_qcif.call.send_side_bwe = true;
Rasmus Brandt3c589be2019-03-13 10:32:40146 paris_qcif.video[0] = {
147 true, 176, 144, 30,
148 300000, 300000, 300000, false,
149 "VP8", 1, 0, 0,
150 false, false, true, ClipNameToClipPath("paris_qcif")};
minyue626bc952016-10-31 12:47:02151 paris_qcif.analyzer = {"net_delay_0_0_plr_0", 36.0, 0.96,
152 kFullStackTestDurationSecs};
Danil Chapovalovbeddb152025-06-16 16:25:10153 fixture.RunWithAnalyzer(paris_qcif);
pbos@webrtc.org994d0b72014-06-27 08:47:52154}
155
Jeremy Lecontec8850cb2020-09-10 18:46:33156TEST(GenericDescriptorTest,
157 Foreman_Cif_Net_Delay_0_0_Plr_0_Generic_Descriptor) {
Danil Chapovalovbeddb152025-06-16 16:25:10158 VideoQualityTest fixture;
stefan@webrtc.orgb8e9e442014-07-09 11:29:06159 // TODO(pbos): Decide on psnr/ssim thresholds for foreman_cif.
Patrik Höglundb6b29e02018-06-21 14:58:01160 ParamsWithLogging foreman_cif;
minyue626bc952016-10-31 12:47:02161 foreman_cif.call.send_side_bwe = true;
Rasmus Brandt3c589be2019-03-13 10:32:40162 foreman_cif.video[0] = {
163 true, 352, 288, 30,
164 700000, 700000, 700000, false,
165 "VP8", 1, 0, 0,
166 false, false, true, ClipNameToClipPath("foreman_cif")};
Danil Chapovalov636865e2020-06-03 12:11:26167 foreman_cif.analyzer = {"foreman_cif_net_delay_0_0_plr_0_generic_descriptor",
168 0.0, 0.0, kFullStackTestDurationSecs};
169 foreman_cif.call.generic_descriptor = true;
Danil Chapovalovbeddb152025-06-16 16:25:10170 fixture.RunWithAnalyzer(foreman_cif);
pbos@webrtc.org994d0b72014-06-27 08:47:52171}
pbos@webrtc.orgaf8d5af2013-07-09 08:02:33172
Jeremy Lecontec8850cb2020-09-10 18:46:33173TEST(GenericDescriptorTest,
Jeremy Leconte4100d552020-09-11 16:02:36174 Foreman_Cif_30kbps_Net_Delay_0_0_Plr_0_Generic_Descriptor) {
Danil Chapovalovbeddb152025-06-16 16:25:10175 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:01176 ParamsWithLogging foreman_cif;
asaperssonfb6ad3b2016-12-16 14:54:01177 foreman_cif.call.send_side_bwe = true;
Rasmus Brandt3c589be2019-03-13 10:32:40178 foreman_cif.video[0] = {
179 true, 352, 288, 10,
180 30000, 30000, 30000, false,
181 "VP8", 1, 0, 0,
182 false, false, true, ClipNameToClipPath("foreman_cif")};
Danil Chapovalov636865e2020-06-03 12:11:26183 foreman_cif.analyzer = {
184 "foreman_cif_30kbps_net_delay_0_0_plr_0_generic_descriptor", 0.0, 0.0,
185 kFullStackTestDurationSecs};
186 foreman_cif.call.generic_descriptor = true;
Danil Chapovalovbeddb152025-06-16 16:25:10187 fixture.RunWithAnalyzer(foreman_cif);
asaperssonfb6ad3b2016-12-16 14:54:01188}
189
Stefan Holmer1f7a0082019-01-11 14:39:08190// Link capacity below default start rate.
Jeremy Leconte4100d552020-09-11 16:02:36191TEST(FullStackTest, Foreman_Cif_Link_150kbps_Net_Delay_0_0_Plr_0) {
Danil Chapovalovbeddb152025-06-16 16:25:10192 VideoQualityTest fixture;
Niels Möller0e909822018-08-21 15:34:35193 ParamsWithLogging foreman_cif;
Niels Möller6aa415e2018-06-07 09:14:13194 foreman_cif.call.send_side_bwe = true;
Rasmus Brandt3c589be2019-03-13 10:32:40195 foreman_cif.video[0] = {
196 true, 352, 288, 30,
197 30000, 500000, 2000000, false,
198 "VP8", 1, 0, 0,
199 false, false, true, ClipNameToClipPath("foreman_cif")};
Jonas Olssona4d87372019-07-05 17:08:33200 foreman_cif.analyzer = {"foreman_cif_link_150kbps_net_delay_0_0_plr_0", 0.0,
201 0.0, kFullStackTestDurationSecs};
Per K5566b912024-05-15 15:53:02202 foreman_cif.config->link_capacity = DataRate::KilobitsPerSec(150);
Danil Chapovalovbeddb152025-06-16 16:25:10203 fixture.RunWithAnalyzer(foreman_cif);
Niels Möller6aa415e2018-06-07 09:14:13204}
205
Erik Språng616b2332019-02-11 13:16:28206// Restricted network and encoder overproducing by 30%.
Jeremy Lecontec8850cb2020-09-10 18:46:33207TEST(FullStackTest,
Jeremy Leconte4100d552020-09-11 16:02:36208 Foreman_Cif_Link_150kbps_Delay100ms_30pkts_Queue_Overshoot30) {
Danil Chapovalovbeddb152025-06-16 16:25:10209 VideoQualityTest fixture;
Erik Språng616b2332019-02-11 13:16:28210 ParamsWithLogging foreman_cif;
211 foreman_cif.call.send_side_bwe = true;
Rasmus Brandt3c589be2019-03-13 10:32:40212 foreman_cif.video[0] = {
213 true, 352, 288, 30,
214 30000, 500000, 2000000, false,
215 "VP8", 1, 0, 0,
216 false, false, true, ClipNameToClipPath("foreman_cif"),
217 0, {}, 1.30};
Erik Språng616b2332019-02-11 13:16:28218 foreman_cif.analyzer = {
219 "foreman_cif_link_150kbps_delay100ms_30pkts_queue_overshoot30", 0.0, 0.0,
220 kFullStackTestDurationSecs};
Per K5566b912024-05-15 15:53:02221 foreman_cif.config->link_capacity = DataRate::KilobitsPerSec(150);
Erik Språng616b2332019-02-11 13:16:28222 foreman_cif.config->queue_length_packets = 30;
223 foreman_cif.config->queue_delay_ms = 100;
Danil Chapovalovbeddb152025-06-16 16:25:10224 fixture.RunWithAnalyzer(foreman_cif);
Erik Språng616b2332019-02-11 13:16:28225}
226
Erik Språng8b8d01a2019-03-02 19:54:55227// Weak 3G-style link: 250kbps, 1% loss, 100ms delay, 15 packets queue.
228// Packet rate and loss are low enough that loss will happen with ~3s interval.
229// This triggers protection overhead to toggle between zero and non-zero.
230// Link queue is restrictive enough to trigger loss on probes.
Jeremy Leconte4100d552020-09-11 16:02:36231TEST(FullStackTest, Foreman_Cif_Link_250kbps_Delay100ms_10pkts_Loss1) {
Danil Chapovalovbeddb152025-06-16 16:25:10232 VideoQualityTest fixture;
Erik Språng8b8d01a2019-03-02 19:54:55233 ParamsWithLogging foreman_cif;
234 foreman_cif.call.send_side_bwe = true;
Rasmus Brandt3c589be2019-03-13 10:32:40235 foreman_cif.video[0] = {
236 true, 352, 288, 30,
237 30000, 500000, 2000000, false,
238 "VP8", 1, 0, 0,
239 false, false, true, ClipNameToClipPath("foreman_cif"),
240 0, {}, 1.30};
Erik Språng8b8d01a2019-03-02 19:54:55241 foreman_cif.analyzer = {"foreman_cif_link_250kbps_delay100ms_10pkts_loss1",
242 0.0, 0.0, kFullStackTestDurationSecs};
Per K5566b912024-05-15 15:53:02243 foreman_cif.config->link_capacity = DataRate::KilobitsPerSec(250);
Erik Språng8b8d01a2019-03-02 19:54:55244 foreman_cif.config->queue_length_packets = 10;
245 foreman_cif.config->queue_delay_ms = 100;
246 foreman_cif.config->loss_percent = 1;
Danil Chapovalovbeddb152025-06-16 16:25:10247 fixture.RunWithAnalyzer(foreman_cif);
Erik Språng8b8d01a2019-03-02 19:54:55248}
249
Jeremy Lecontec8850cb2020-09-10 18:46:33250TEST(GenericDescriptorTest, Foreman_Cif_Delay_50_0_Plr_5_Generic_Descriptor) {
Danil Chapovalovbeddb152025-06-16 16:25:10251 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:01252 ParamsWithLogging foreman_cif;
minyue626bc952016-10-31 12:47:02253 foreman_cif.call.send_side_bwe = true;
Rasmus Brandt3c589be2019-03-13 10:32:40254 foreman_cif.video[0] = {
255 true, 352, 288, 30,
256 30000, 500000, 2000000, false,
257 "VP8", 1, 0, 0,
258 false, false, true, ClipNameToClipPath("foreman_cif")};
Danil Chapovalov636865e2020-06-03 12:11:26259 foreman_cif.analyzer = {"foreman_cif_delay_50_0_plr_5_generic_descriptor",
260 0.0, 0.0, kFullStackTestDurationSecs};
Artem Titovf18b3522018-08-28 14:54:24261 foreman_cif.config->loss_percent = 5;
262 foreman_cif.config->queue_delay_ms = 50;
Danil Chapovalov636865e2020-06-03 12:11:26263 foreman_cif.call.generic_descriptor = true;
Danil Chapovalovbeddb152025-06-16 16:25:10264 fixture.RunWithAnalyzer(foreman_cif);
stefan@webrtc.orgc216b9a2014-10-14 10:38:49265}
266
Jeremy Lecontec8850cb2020-09-10 18:46:33267TEST(GenericDescriptorTest,
268 Foreman_Cif_Delay_50_0_Plr_5_Ulpfec_Generic_Descriptor) {
Danil Chapovalovbeddb152025-06-16 16:25:10269 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:01270 ParamsWithLogging foreman_cif;
brandtr93c5d032016-11-30 15:50:07271 foreman_cif.call.send_side_bwe = true;
Rasmus Brandt3c589be2019-03-13 10:32:40272 foreman_cif.video[0] = {
273 true, 352, 288, 30,
274 30000, 500000, 2000000, false,
275 "VP8", 1, 0, 0,
276 true, false, true, ClipNameToClipPath("foreman_cif")};
Danil Chapovalov636865e2020-06-03 12:11:26277 foreman_cif.analyzer = {
278 "foreman_cif_delay_50_0_plr_5_ulpfec_generic_descriptor", 0.0, 0.0,
279 kFullStackTestDurationSecs};
Artem Titovf18b3522018-08-28 14:54:24280 foreman_cif.config->loss_percent = 5;
281 foreman_cif.config->queue_delay_ms = 50;
Danil Chapovalov636865e2020-06-03 12:11:26282 foreman_cif.call.generic_descriptor = true;
Danil Chapovalovbeddb152025-06-16 16:25:10283 fixture.RunWithAnalyzer(foreman_cif);
brandtr93c5d032016-11-30 15:50:07284}
285
Jeremy Lecontec8850cb2020-09-10 18:46:33286TEST(FullStackTest, Foreman_Cif_Delay_50_0_Plr_5_Flexfec) {
Danil Chapovalovbeddb152025-06-16 16:25:10287 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:01288 ParamsWithLogging foreman_cif;
brandtr93c5d032016-11-30 15:50:07289 foreman_cif.call.send_side_bwe = true;
Rasmus Brandt3c589be2019-03-13 10:32:40290 foreman_cif.video[0] = {
291 true, 352, 288, 30,
292 30000, 500000, 2000000, false,
293 "VP8", 1, 0, 0,
294 false, true, true, ClipNameToClipPath("foreman_cif")};
brandtr93c5d032016-11-30 15:50:07295 foreman_cif.analyzer = {"foreman_cif_delay_50_0_plr_5_flexfec", 0.0, 0.0,
296 kFullStackTestDurationSecs};
Artem Titovf18b3522018-08-28 14:54:24297 foreman_cif.config->loss_percent = 5;
298 foreman_cif.config->queue_delay_ms = 50;
Danil Chapovalovbeddb152025-06-16 16:25:10299 fixture.RunWithAnalyzer(foreman_cif);
brandtr93c5d032016-11-30 15:50:07300}
301
Jeremy Leconte4100d552020-09-11 16:02:36302TEST(FullStackTest, Foreman_Cif_500kbps_Delay_50_0_Plr_3_Flexfec) {
Danil Chapovalovbeddb152025-06-16 16:25:10303 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:01304 ParamsWithLogging foreman_cif;
stefan889d9652017-07-05 10:03:02305 foreman_cif.call.send_side_bwe = true;
Rasmus Brandt3c589be2019-03-13 10:32:40306 foreman_cif.video[0] = {
307 true, 352, 288, 30,
308 30000, 500000, 2000000, false,
309 "VP8", 1, 0, 0,
310 false, true, true, ClipNameToClipPath("foreman_cif")};
stefan889d9652017-07-05 10:03:02311 foreman_cif.analyzer = {"foreman_cif_500kbps_delay_50_0_plr_3_flexfec", 0.0,
312 0.0, kFullStackTestDurationSecs};
Artem Titovf18b3522018-08-28 14:54:24313 foreman_cif.config->loss_percent = 3;
Per K5566b912024-05-15 15:53:02314 foreman_cif.config->link_capacity = DataRate::KilobitsPerSec(500);
Artem Titovf18b3522018-08-28 14:54:24315 foreman_cif.config->queue_delay_ms = 50;
Danil Chapovalovbeddb152025-06-16 16:25:10316 fixture.RunWithAnalyzer(foreman_cif);
stefan889d9652017-07-05 10:03:02317}
318
Jeremy Leconte4100d552020-09-11 16:02:36319TEST(FullStackTest, Foreman_Cif_500kbps_Delay_50_0_Plr_3_Ulpfec) {
Danil Chapovalovbeddb152025-06-16 16:25:10320 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:01321 ParamsWithLogging foreman_cif;
stefan889d9652017-07-05 10:03:02322 foreman_cif.call.send_side_bwe = true;
Rasmus Brandt3c589be2019-03-13 10:32:40323 foreman_cif.video[0] = {
324 true, 352, 288, 30,
325 30000, 500000, 2000000, false,
326 "VP8", 1, 0, 0,
327 true, false, true, ClipNameToClipPath("foreman_cif")};
stefan889d9652017-07-05 10:03:02328 foreman_cif.analyzer = {"foreman_cif_500kbps_delay_50_0_plr_3_ulpfec", 0.0,
329 0.0, kFullStackTestDurationSecs};
Artem Titovf18b3522018-08-28 14:54:24330 foreman_cif.config->loss_percent = 3;
Per K5566b912024-05-15 15:53:02331 foreman_cif.config->link_capacity = DataRate::KilobitsPerSec(500);
Artem Titovf18b3522018-08-28 14:54:24332 foreman_cif.config->queue_delay_ms = 50;
Danil Chapovalovbeddb152025-06-16 16:25:10333 fixture.RunWithAnalyzer(foreman_cif);
stefan889d9652017-07-05 10:03:02334}
335
brandtrdd369c62016-11-17 07:56:57336#if defined(WEBRTC_USE_H264)
Jeremy Lecontec8850cb2020-09-10 18:46:33337TEST(FullStackTest, Foreman_Cif_Net_Delay_0_0_Plr_0_H264) {
Danil Chapovalovbeddb152025-06-16 16:25:10338 VideoQualityTest fixture;
brandtr93c5d032016-11-30 15:50:07339 // TODO(pbos): Decide on psnr/ssim thresholds for foreman_cif.
Patrik Höglundb6b29e02018-06-21 14:58:01340 ParamsWithLogging foreman_cif;
brandtr93c5d032016-11-30 15:50:07341 foreman_cif.call.send_side_bwe = true;
Rasmus Brandt3c589be2019-03-13 10:32:40342 foreman_cif.video[0] = {
343 true, 352, 288, 30,
344 700000, 700000, 700000, false,
345 "H264", 1, 0, 0,
346 false, false, true, ClipNameToClipPath("foreman_cif")};
brandtr93c5d032016-11-30 15:50:07347 foreman_cif.analyzer = {"foreman_cif_net_delay_0_0_plr_0_H264", 0.0, 0.0,
348 kFullStackTestDurationSecs};
Danil Chapovalovbeddb152025-06-16 16:25:10349 fixture.RunWithAnalyzer(foreman_cif);
brandtrdd369c62016-11-17 07:56:57350}
351
Jeremy Leconte4100d552020-09-11 16:02:36352TEST(FullStackTest, Foreman_Cif_30kbps_Net_Delay_0_0_Plr_0_H264) {
Danil Chapovalovbeddb152025-06-16 16:25:10353 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:01354 ParamsWithLogging foreman_cif;
asaperssonfb6ad3b2016-12-16 14:54:01355 foreman_cif.call.send_side_bwe = true;
Rasmus Brandt3c589be2019-03-13 10:32:40356 foreman_cif.video[0] = {
357 true, 352, 288, 10,
358 30000, 30000, 30000, false,
359 "H264", 1, 0, 0,
360 false, false, true, ClipNameToClipPath("foreman_cif")};
asaperssonfb6ad3b2016-12-16 14:54:01361 foreman_cif.analyzer = {"foreman_cif_30kbps_net_delay_0_0_plr_0_H264", 0.0,
362 0.0, kFullStackTestDurationSecs};
Danil Chapovalovbeddb152025-06-16 16:25:10363 fixture.RunWithAnalyzer(foreman_cif);
asaperssonfb6ad3b2016-12-16 14:54:01364}
365
Jeremy Lecontec8850cb2020-09-10 18:46:33366TEST(GenericDescriptorTest,
367 Foreman_Cif_Delay_50_0_Plr_5_H264_Generic_Descriptor) {
Danil Chapovalovbeddb152025-06-16 16:25:10368 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:01369 ParamsWithLogging foreman_cif;
brandtr93c5d032016-11-30 15:50:07370 foreman_cif.call.send_side_bwe = true;
Rasmus Brandt3c589be2019-03-13 10:32:40371 foreman_cif.video[0] = {
372 true, 352, 288, 30,
373 30000, 500000, 2000000, false,
374 "H264", 1, 0, 0,
375 false, false, true, ClipNameToClipPath("foreman_cif")};
Danil Chapovalov636865e2020-06-03 12:11:26376 foreman_cif.analyzer = {
377 "foreman_cif_delay_50_0_plr_5_H264_generic_descriptor", 0.0, 0.0,
378 kFullStackTestDurationSecs};
Artem Titovf18b3522018-08-28 14:54:24379 foreman_cif.config->loss_percent = 5;
380 foreman_cif.config->queue_delay_ms = 50;
Danil Chapovalov636865e2020-06-03 12:11:26381 foreman_cif.call.generic_descriptor = true;
Danil Chapovalovbeddb152025-06-16 16:25:10382 fixture.RunWithAnalyzer(foreman_cif);
brandtrdd369c62016-11-17 07:56:57383}
384
Erik Språngeb3307f2022-08-22 09:06:06385TEST(FullStackTest, Foreman_Cif_Delay_50_0_Plr_5_H264_Sps_Pps_Idr) {
Danil Chapovalovbeddb152025-06-16 16:25:10386 VideoQualityTest fixture(
387 {.field_trials = "WebRTC-SpsPpsIdrIsH264Keyframe/Enabled/"});
Erik Språngeb3307f2022-08-22 09:06:06388
389 ParamsWithLogging foreman_cif;
390 foreman_cif.call.send_side_bwe = true;
391 foreman_cif.video[0] = {
392 true, 352, 288, 30,
393 30000, 500000, 2000000, false,
394 "H264", 1, 0, 0,
395 false, false, true, ClipNameToClipPath("foreman_cif")};
396 foreman_cif.analyzer = {"foreman_cif_delay_50_0_plr_5_H264_sps_pps_idr", 0.0,
397 0.0, kFullStackTestDurationSecs};
398 foreman_cif.config->loss_percent = 5;
399 foreman_cif.config->queue_delay_ms = 50;
Danil Chapovalovbeddb152025-06-16 16:25:10400 fixture.RunWithAnalyzer(foreman_cif);
Erik Språngeb3307f2022-08-22 09:06:06401}
402
brandtrdd369c62016-11-17 07:56:57403// Verify that this is worth the bot time, before enabling.
Jeremy Lecontec8850cb2020-09-10 18:46:33404TEST(FullStackTest, Foreman_Cif_Delay_50_0_Plr_5_H264_Flexfec) {
Danil Chapovalovbeddb152025-06-16 16:25:10405 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:01406 ParamsWithLogging foreman_cif;
brandtr93c5d032016-11-30 15:50:07407 foreman_cif.call.send_side_bwe = true;
Rasmus Brandt3c589be2019-03-13 10:32:40408 foreman_cif.video[0] = {
409 true, 352, 288, 30,
410 30000, 500000, 2000000, false,
411 "H264", 1, 0, 0,
412 false, true, true, ClipNameToClipPath("foreman_cif")};
brandtr93c5d032016-11-30 15:50:07413 foreman_cif.analyzer = {"foreman_cif_delay_50_0_plr_5_H264_flexfec", 0.0, 0.0,
414 kFullStackTestDurationSecs};
Artem Titovf18b3522018-08-28 14:54:24415 foreman_cif.config->loss_percent = 5;
416 foreman_cif.config->queue_delay_ms = 50;
Danil Chapovalovbeddb152025-06-16 16:25:10417 fixture.RunWithAnalyzer(foreman_cif);
brandtrdd369c62016-11-17 07:56:57418}
419
420// Ulpfec with H264 is an unsupported combination, so this test is only useful
421// for debugging. It is therefore disabled by default.
Jeremy Lecontec8850cb2020-09-10 18:46:33422TEST(FullStackTest, DISABLED_Foreman_Cif_Delay_50_0_Plr_5_H264_Ulpfec) {
Danil Chapovalovbeddb152025-06-16 16:25:10423 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:01424 ParamsWithLogging foreman_cif;
brandtr93c5d032016-11-30 15:50:07425 foreman_cif.call.send_side_bwe = true;
Rasmus Brandt3c589be2019-03-13 10:32:40426 foreman_cif.video[0] = {
427 true, 352, 288, 30,
428 30000, 500000, 2000000, false,
429 "H264", 1, 0, 0,
430 true, false, true, ClipNameToClipPath("foreman_cif")};
brandtr93c5d032016-11-30 15:50:07431 foreman_cif.analyzer = {"foreman_cif_delay_50_0_plr_5_H264_ulpfec", 0.0, 0.0,
432 kFullStackTestDurationSecs};
Artem Titovf18b3522018-08-28 14:54:24433 foreman_cif.config->loss_percent = 5;
434 foreman_cif.config->queue_delay_ms = 50;
Danil Chapovalovbeddb152025-06-16 16:25:10435 fixture.RunWithAnalyzer(foreman_cif);
brandtrdd369c62016-11-17 07:56:57436}
437#endif // defined(WEBRTC_USE_H264)
438
Jeremy Leconte4100d552020-09-11 16:02:36439TEST(FullStackTest, Foreman_Cif_500kbps) {
Danil Chapovalovbeddb152025-06-16 16:25:10440 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:01441 ParamsWithLogging foreman_cif;
minyue626bc952016-10-31 12:47:02442 foreman_cif.call.send_side_bwe = true;
Rasmus Brandt3c589be2019-03-13 10:32:40443 foreman_cif.video[0] = {
444 true, 352, 288, 30,
445 30000, 500000, 2000000, false,
446 "VP8", 1, 0, 0,
447 false, false, true, ClipNameToClipPath("foreman_cif")};
minyue626bc952016-10-31 12:47:02448 foreman_cif.analyzer = {"foreman_cif_500kbps", 0.0, 0.0,
449 kFullStackTestDurationSecs};
Artem Titovf18b3522018-08-28 14:54:24450 foreman_cif.config->queue_length_packets = 0;
451 foreman_cif.config->queue_delay_ms = 0;
Per K5566b912024-05-15 15:53:02452 foreman_cif.config->link_capacity = DataRate::KilobitsPerSec(500);
Danil Chapovalovbeddb152025-06-16 16:25:10453 fixture.RunWithAnalyzer(foreman_cif);
stefan@webrtc.orgb8e9e442014-07-09 11:29:06454}
455
Jeremy Leconte4100d552020-09-11 16:02:36456TEST(FullStackTest, Foreman_Cif_500kbps_32pkts_Queue) {
Danil Chapovalovbeddb152025-06-16 16:25:10457 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:01458 ParamsWithLogging foreman_cif;
minyue626bc952016-10-31 12:47:02459 foreman_cif.call.send_side_bwe = true;
Rasmus Brandt3c589be2019-03-13 10:32:40460 foreman_cif.video[0] = {
461 true, 352, 288, 30,
462 30000, 500000, 2000000, false,
463 "VP8", 1, 0, 0,
464 false, false, true, ClipNameToClipPath("foreman_cif")};
minyue626bc952016-10-31 12:47:02465 foreman_cif.analyzer = {"foreman_cif_500kbps_32pkts_queue", 0.0, 0.0,
466 kFullStackTestDurationSecs};
Artem Titovf18b3522018-08-28 14:54:24467 foreman_cif.config->queue_length_packets = 32;
468 foreman_cif.config->queue_delay_ms = 0;
Per K5566b912024-05-15 15:53:02469 foreman_cif.config->link_capacity = DataRate::KilobitsPerSec(500);
Danil Chapovalovbeddb152025-06-16 16:25:10470 fixture.RunWithAnalyzer(foreman_cif);
stefan@webrtc.orgb8e9e442014-07-09 11:29:06471}
472
Jeremy Leconte4100d552020-09-11 16:02:36473TEST(FullStackTest, Foreman_Cif_500kbps_100ms) {
Danil Chapovalovbeddb152025-06-16 16:25:10474 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:01475 ParamsWithLogging foreman_cif;
minyue626bc952016-10-31 12:47:02476 foreman_cif.call.send_side_bwe = true;
Rasmus Brandt3c589be2019-03-13 10:32:40477 foreman_cif.video[0] = {
478 true, 352, 288, 30,
479 30000, 500000, 2000000, false,
480 "VP8", 1, 0, 0,
481 false, false, true, ClipNameToClipPath("foreman_cif")};
minyue626bc952016-10-31 12:47:02482 foreman_cif.analyzer = {"foreman_cif_500kbps_100ms", 0.0, 0.0,
483 kFullStackTestDurationSecs};
Artem Titovf18b3522018-08-28 14:54:24484 foreman_cif.config->queue_length_packets = 0;
485 foreman_cif.config->queue_delay_ms = 100;
Per K5566b912024-05-15 15:53:02486 foreman_cif.config->link_capacity = DataRate::KilobitsPerSec(500);
Danil Chapovalovbeddb152025-06-16 16:25:10487 fixture.RunWithAnalyzer(foreman_cif);
stefan@webrtc.orgb8e9e442014-07-09 11:29:06488}
489
Jeremy Lecontec8850cb2020-09-10 18:46:33490TEST(GenericDescriptorTest,
Jeremy Leconte4100d552020-09-11 16:02:36491 Foreman_Cif_500kbps_100ms_32pkts_Queue_Generic_Descriptor) {
Danil Chapovalovbeddb152025-06-16 16:25:10492 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:01493 ParamsWithLogging foreman_cif;
minyue626bc952016-10-31 12:47:02494 foreman_cif.call.send_side_bwe = true;
Rasmus Brandt3c589be2019-03-13 10:32:40495 foreman_cif.video[0] = {
496 true, 352, 288, 30,
497 30000, 500000, 2000000, false,
498 "VP8", 1, 0, 0,
499 false, false, true, ClipNameToClipPath("foreman_cif")};
Danil Chapovalov636865e2020-06-03 12:11:26500 foreman_cif.analyzer = {
501 "foreman_cif_500kbps_100ms_32pkts_queue_generic_descriptor", 0.0, 0.0,
502 kFullStackTestDurationSecs};
Artem Titovf18b3522018-08-28 14:54:24503 foreman_cif.config->queue_length_packets = 32;
504 foreman_cif.config->queue_delay_ms = 100;
Per K5566b912024-05-15 15:53:02505 foreman_cif.config->link_capacity = DataRate::KilobitsPerSec(500);
Danil Chapovalov636865e2020-06-03 12:11:26506 foreman_cif.call.generic_descriptor = true;
Danil Chapovalovbeddb152025-06-16 16:25:10507 fixture.RunWithAnalyzer(foreman_cif);
stefanb1797672016-08-11 14:00:57508}
509
Jeremy Leconte4100d552020-09-11 16:02:36510TEST(FullStackTest, Foreman_Cif_500kbps_100ms_32pkts_Queue_Recv_Bwe) {
Danil Chapovalovbeddb152025-06-16 16:25:10511 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:01512 ParamsWithLogging foreman_cif;
brandtr93c5d032016-11-30 15:50:07513 foreman_cif.call.send_side_bwe = false;
Rasmus Brandt3c589be2019-03-13 10:32:40514 foreman_cif.video[0] = {
515 true, 352, 288, 30,
516 30000, 500000, 2000000, false,
517 "VP8", 1, 0, 0,
518 false, false, true, ClipNameToClipPath("foreman_cif")};
brandtr93c5d032016-11-30 15:50:07519 foreman_cif.analyzer = {"foreman_cif_500kbps_100ms_32pkts_queue_recv_bwe",
520 0.0, 0.0, kFullStackTestDurationSecs};
Artem Titovf18b3522018-08-28 14:54:24521 foreman_cif.config->queue_length_packets = 32;
522 foreman_cif.config->queue_delay_ms = 100;
Per K5566b912024-05-15 15:53:02523 foreman_cif.config->link_capacity = DataRate::KilobitsPerSec(500);
Danil Chapovalovbeddb152025-06-16 16:25:10524 fixture.RunWithAnalyzer(foreman_cif);
stefan@webrtc.orgb8e9e442014-07-09 11:29:06525}
526
Jeremy Leconte4100d552020-09-11 16:02:36527TEST(FullStackTest, Foreman_Cif_1000kbps_100ms_32pkts_Queue) {
Danil Chapovalovbeddb152025-06-16 16:25:10528 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:01529 ParamsWithLogging foreman_cif;
minyue626bc952016-10-31 12:47:02530 foreman_cif.call.send_side_bwe = true;
Rasmus Brandt3c589be2019-03-13 10:32:40531 foreman_cif.video[0] = {
532 true, 352, 288, 30,
533 30000, 2000000, 2000000, false,
534 "VP8", 1, 0, 0,
535 false, false, true, ClipNameToClipPath("foreman_cif")};
minyue626bc952016-10-31 12:47:02536 foreman_cif.analyzer = {"foreman_cif_1000kbps_100ms_32pkts_queue", 0.0, 0.0,
537 kFullStackTestDurationSecs};
Artem Titovf18b3522018-08-28 14:54:24538 foreman_cif.config->queue_length_packets = 32;
539 foreman_cif.config->queue_delay_ms = 100;
Per K5566b912024-05-15 15:53:02540 foreman_cif.config->link_capacity = DataRate::KilobitsPerSec(1000);
Danil Chapovalovbeddb152025-06-16 16:25:10541 fixture.RunWithAnalyzer(foreman_cif);
stefan@webrtc.orgb8e9e442014-07-09 11:29:06542}
sprang@webrtc.org131bea82015-02-18 12:46:06543
sprangff19d352017-09-06 14:14:02544// TODO(sprang): Remove this if we have the similar ModerateLimits below?
Jeremy Leconte4100d552020-09-11 16:02:36545TEST(FullStackTest, Conference_Motion_Hd_2000kbps_100ms_32pkts_Queue) {
Danil Chapovalovbeddb152025-06-16 16:25:10546 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:01547 ParamsWithLogging conf_motion_hd;
minyue626bc952016-10-31 12:47:02548 conf_motion_hd.call.send_side_bwe = true;
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59549 conf_motion_hd.video[0] = {
Rasmus Brandt3c589be2019-03-13 10:32:40550 true, 1280,
551 720, 50,
552 30000, 3000000,
553 3000000, false,
554 "VP8", 1,
555 0, 0,
556 false, false,
557 false, ClipNameToClipPath("ConferenceMotion_1280_720_50")};
minyue626bc952016-10-31 12:47:02558 conf_motion_hd.analyzer = {"conference_motion_hd_2000kbps_100ms_32pkts_queue",
559 0.0, 0.0, kFullStackTestDurationSecs};
Artem Titovf18b3522018-08-28 14:54:24560 conf_motion_hd.config->queue_length_packets = 32;
561 conf_motion_hd.config->queue_delay_ms = 100;
Per K5566b912024-05-15 15:53:02562 conf_motion_hd.config->link_capacity = DataRate::KilobitsPerSec(2000);
Danil Chapovalovbeddb152025-06-16 16:25:10563 fixture.RunWithAnalyzer(conf_motion_hd);
stefanb1797672016-08-11 14:00:57564}
565
Jeremy Lecontec8850cb2020-09-10 18:46:33566TEST(GenericDescriptorTest,
Jeremy Leconte4100d552020-09-11 16:02:36567 Conference_Motion_Hd_2tl_Moderate_Limits_Generic_Descriptor) {
Danil Chapovalovbeddb152025-06-16 16:25:10568 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:01569 ParamsWithLogging conf_motion_hd;
sprangff19d352017-09-06 14:14:02570 conf_motion_hd.call.send_side_bwe = true;
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59571 conf_motion_hd.video[0] = {
Rasmus Brandt3c589be2019-03-13 10:32:40572 true, 1280,
573 720, 50,
574 30000, 3000000,
575 3000000, false,
576 "VP8", 2,
577 -1, 0,
578 false, false,
579 false, ClipNameToClipPath("ConferenceMotion_1280_720_50")};
philipeldd8b0d82018-09-27 09:18:10580 conf_motion_hd.analyzer = {
Danil Chapovalov636865e2020-06-03 12:11:26581 "conference_motion_hd_2tl_moderate_limits_generic_descriptor", 0.0, 0.0,
philipeldd8b0d82018-09-27 09:18:10582 kFullStackTestDurationSecs};
Artem Titovf18b3522018-08-28 14:54:24583 conf_motion_hd.config->queue_length_packets = 50;
584 conf_motion_hd.config->loss_percent = 3;
585 conf_motion_hd.config->queue_delay_ms = 100;
Per K5566b912024-05-15 15:53:02586 conf_motion_hd.config->link_capacity = DataRate::KilobitsPerSec(2000);
Danil Chapovalov636865e2020-06-03 12:11:26587 conf_motion_hd.call.generic_descriptor = true;
Danil Chapovalovbeddb152025-06-16 16:25:10588 fixture.RunWithAnalyzer(conf_motion_hd);
sprangff19d352017-09-06 14:14:02589}
590
Jeremy Leconte4100d552020-09-11 16:02:36591TEST(FullStackTest, Conference_Motion_Hd_3tl_Moderate_Limits) {
Danil Chapovalovbeddb152025-06-16 16:25:10592 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:01593 ParamsWithLogging conf_motion_hd;
sprangff19d352017-09-06 14:14:02594 conf_motion_hd.call.send_side_bwe = true;
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59595 conf_motion_hd.video[0] = {
Rasmus Brandt3c589be2019-03-13 10:32:40596 true, 1280,
597 720, 50,
598 30000, 3000000,
599 3000000, false,
600 "VP8", 3,
601 -1, 0,
602 false, false,
603 false, ClipNameToClipPath("ConferenceMotion_1280_720_50")};
sprangff19d352017-09-06 14:14:02604 conf_motion_hd.analyzer = {"conference_motion_hd_3tl_moderate_limits", 0.0,
605 0.0, kFullStackTestDurationSecs};
Artem Titovf18b3522018-08-28 14:54:24606 conf_motion_hd.config->queue_length_packets = 50;
607 conf_motion_hd.config->loss_percent = 3;
608 conf_motion_hd.config->queue_delay_ms = 100;
Per K5566b912024-05-15 15:53:02609 conf_motion_hd.config->link_capacity = DataRate::KilobitsPerSec(2000);
Danil Chapovalovbeddb152025-06-16 16:25:10610 fixture.RunWithAnalyzer(conf_motion_hd);
sprangff19d352017-09-06 14:14:02611}
612
Jeremy Leconte4100d552020-09-11 16:02:36613TEST(FullStackTest, Conference_Motion_Hd_4tl_Moderate_Limits) {
Danil Chapovalovbeddb152025-06-16 16:25:10614 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:01615 ParamsWithLogging conf_motion_hd;
sprangff19d352017-09-06 14:14:02616 conf_motion_hd.call.send_side_bwe = true;
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59617 conf_motion_hd.video[0] = {
Rasmus Brandt3c589be2019-03-13 10:32:40618 true, 1280,
619 720, 50,
620 30000, 3000000,
621 3000000, false,
622 "VP8", 4,
623 -1, 0,
624 false, false,
625 false, ClipNameToClipPath("ConferenceMotion_1280_720_50")};
sprangff19d352017-09-06 14:14:02626 conf_motion_hd.analyzer = {"conference_motion_hd_4tl_moderate_limits", 0.0,
627 0.0, kFullStackTestDurationSecs};
Artem Titovf18b3522018-08-28 14:54:24628 conf_motion_hd.config->queue_length_packets = 50;
629 conf_motion_hd.config->loss_percent = 3;
630 conf_motion_hd.config->queue_delay_ms = 100;
Per K5566b912024-05-15 15:53:02631 conf_motion_hd.config->link_capacity = DataRate::KilobitsPerSec(2000);
Danil Chapovalovbeddb152025-06-16 16:25:10632 fixture.RunWithAnalyzer(conf_motion_hd);
sprangff19d352017-09-06 14:14:02633}
634
philipelc22893b2023-04-24 09:34:39635TEST(FullStackTest, Foreman_Cif_30kbps_AV1) {
Danil Chapovalovbeddb152025-06-16 16:25:10636 VideoQualityTest fixture;
philipelc22893b2023-04-24 09:34:39637 ParamsWithLogging foreman_cif;
638 foreman_cif.call.send_side_bwe = true;
639 foreman_cif.video[0] = {.enabled = true,
640 .width = 352,
641 .height = 288,
642 .fps = 10,
643 .min_bitrate_bps = 20'000,
644 .target_bitrate_bps = 30'000,
645 .max_bitrate_bps = 100'000,
646 .codec = "AV1",
647 .num_temporal_layers = 1,
648 .selected_tl = 0,
649 .clip_path = ClipNameToClipPath("foreman_cif")};
650 foreman_cif.analyzer = {.test_label = "foreman_cif_30kbps_AV1",
651 .test_durations_secs = kFullStackTestDurationSecs};
Per K5566b912024-05-15 15:53:02652 foreman_cif.config->link_capacity = DataRate::KilobitsPerSec(30);
philipelc22893b2023-04-24 09:34:39653 foreman_cif.call.generic_descriptor = true;
Danil Chapovalovbeddb152025-06-16 16:25:10654 fixture.RunWithAnalyzer(foreman_cif);
philipelc22893b2023-04-24 09:34:39655}
656
657TEST(FullStackTest, Conference_Motion_Hd_3tl_AV1) {
Danil Chapovalovbeddb152025-06-16 16:25:10658 VideoQualityTest fixture;
philipelc22893b2023-04-24 09:34:39659 ParamsWithLogging conf_motion_hd;
660 conf_motion_hd.call.send_side_bwe = true;
661 conf_motion_hd.video[0] = {
662 .enabled = true,
663 .width = 1280,
664 .height = 720,
665 .fps = 50,
666 .min_bitrate_bps = 20'000,
667 .target_bitrate_bps = 500'000,
668 .max_bitrate_bps = 1'000'000,
669 .codec = "AV1",
670 .num_temporal_layers = 3,
671 .clip_path = ClipNameToClipPath("ConferenceMotion_1280_720_50")};
672
673 conf_motion_hd.analyzer = {.test_label = "conference_motion_hd_3tl_AV1",
674 .test_durations_secs = kFullStackTestDurationSecs};
675 conf_motion_hd.config->queue_length_packets = 50;
676 conf_motion_hd.config->loss_percent = 3;
677 conf_motion_hd.config->queue_delay_ms = 100;
Per K5566b912024-05-15 15:53:02678 conf_motion_hd.config->link_capacity = DataRate::KilobitsPerSec(1000);
philipelc22893b2023-04-24 09:34:39679 conf_motion_hd.call.generic_descriptor = true;
Danil Chapovalovbeddb152025-06-16 16:25:10680 fixture.RunWithAnalyzer(conf_motion_hd);
philipelc22893b2023-04-24 09:34:39681}
682
Sergey Silkinffca3242024-07-08 07:04:10683#if defined(WEBRTC_MAC)
684// TODO(webrtc:351644561): Flaky on Mac x86/ARM.
685#define MAYBE_Screenshare_Slides_Simulcast_AV1 \
686 DISABLED_Screenshare_Slides_Simulcast_AV1
687#else
688#define MAYBE_Screenshare_Slides_Simulcast_AV1 Screenshare_Slides_Simulcast_AV1
689#endif
690TEST(FullStackTest, MAYBE_Screenshare_Slides_Simulcast_AV1) {
Danil Chapovalovbeddb152025-06-16 16:25:10691 VideoQualityTest fixture;
Sergey Silkin26d3e562024-06-22 11:39:49692 ParamsWithLogging screenshare;
693 screenshare.analyzer = {.test_label = "screenshare_slides_simulcast_AV1",
694 .test_durations_secs = kFullStackTestDurationSecs};
695 screenshare.call.send_side_bwe = true;
696 screenshare.screenshare[0] = {.enabled = true};
697 screenshare.video[0] = {.enabled = true,
698 .width = 1850,
699 .height = 1110,
700 .fps = 30,
701 .min_bitrate_bps = 0,
702 .target_bitrate_bps = 0,
703 .max_bitrate_bps = 2500000,
704 .codec = "AV1",
705 .num_temporal_layers = 2};
706
707 // Set `min_bitrate_bps` and `target_bitrate_bps` to zero to use WebRTC
708 // defaults.
709 VideoQualityTest::Params screenshare_params_low;
710 screenshare_params_low.video[0] = {.enabled = true,
711 .width = 1850,
712 .height = 1110,
713 .fps = 5,
714 .min_bitrate_bps = 0,
715 .target_bitrate_bps = 0,
716 .max_bitrate_bps = 420'000,
717 .codec = "AV1",
718 .num_temporal_layers = 2};
719
720 VideoQualityTest::Params screenshare_params_high;
721 screenshare_params_high.video[0] = {.enabled = true,
722 .width = 1850,
723 .height = 1110,
724 .fps = 30,
725 .min_bitrate_bps = 0,
726 .target_bitrate_bps = 0,
727 .max_bitrate_bps = 2'500'000,
728 .codec = "AV1",
729 .num_temporal_layers = 2};
730
731 std::vector<VideoStream> streams = {
732 VideoQualityTest::DefaultVideoStream(screenshare_params_low, 0),
733 VideoQualityTest::DefaultVideoStream(screenshare_params_high, 0)};
734 screenshare.ss[0] = {
735 .streams = streams,
736 .selected_stream = 1,
737 };
Danil Chapovalovbeddb152025-06-16 16:25:10738 fixture.RunWithAnalyzer(screenshare);
Sergey Silkin26d3e562024-06-22 11:39:49739}
740
Mirko Bonadei8ef57932018-11-16 13:38:03741#if defined(RTC_ENABLE_VP9)
Jeremy Leconte4100d552020-09-11 16:02:36742TEST(FullStackTest, Conference_Motion_Hd_2000kbps_100ms_32pkts_Queue_Vp9) {
Danil Chapovalovbeddb152025-06-16 16:25:10743 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:01744 ParamsWithLogging conf_motion_hd;
jianj390e64d2017-02-03 17:51:23745 conf_motion_hd.call.send_side_bwe = true;
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59746 conf_motion_hd.video[0] = {
Rasmus Brandt3c589be2019-03-13 10:32:40747 true, 1280,
748 720, 50,
749 30000, 3000000,
750 3000000, false,
751 "VP9", 1,
752 0, 0,
753 false, false,
754 false, ClipNameToClipPath("ConferenceMotion_1280_720_50")};
jianj390e64d2017-02-03 17:51:23755 conf_motion_hd.analyzer = {
756 "conference_motion_hd_2000kbps_100ms_32pkts_queue_vp9", 0.0, 0.0,
757 kFullStackTestDurationSecs};
Artem Titovf18b3522018-08-28 14:54:24758 conf_motion_hd.config->queue_length_packets = 32;
759 conf_motion_hd.config->queue_delay_ms = 100;
Per K5566b912024-05-15 15:53:02760 conf_motion_hd.config->link_capacity = DataRate::KilobitsPerSec(2000);
Danil Chapovalovbeddb152025-06-16 16:25:10761 fixture.RunWithAnalyzer(conf_motion_hd);
jianj390e64d2017-02-03 17:51:23762}
763#endif
764
Jeremy Lecontec8850cb2020-09-10 18:46:33765TEST(FullStackTest, Screenshare_Slides) {
Danil Chapovalovbeddb152025-06-16 16:25:10766 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:01767 ParamsWithLogging screenshare;
minyue626bc952016-10-31 12:47:02768 screenshare.call.send_side_bwe = true;
Erik Språng28bb3912018-07-11 14:06:55769 screenshare.video[0] = {true, 1850, 1110, 5, 50000, 200000,
770 1000000, false, "VP8", 2, 1, 400000,
771 false, false, false, ""};
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59772 screenshare.screenshare[0] = {true, false, 10};
minyue626bc952016-10-31 12:47:02773 screenshare.analyzer = {"screenshare_slides", 0.0, 0.0,
774 kFullStackTestDurationSecs};
Danil Chapovalovbeddb152025-06-16 16:25:10775 fixture.RunWithAnalyzer(screenshare);
Erik Språng6ee69aa2015-09-03 13:58:05776}
777
Florent Castelli66b38602019-07-10 14:57:57778#if !defined(WEBRTC_MAC) && !defined(WEBRTC_WIN)
Oskar Sundbom8bacf252019-01-08 15:40:08779// TODO(bugs.webrtc.org/9840): Investigate why is this test flaky on Win/Mac.
Jeremy Lecontec8850cb2020-09-10 18:46:33780TEST(FullStackTest, Screenshare_Slides_Simulcast) {
Danil Chapovalovbeddb152025-06-16 16:25:10781 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:01782 ParamsWithLogging screenshare;
ilnikcb8c1462017-03-09 17:23:30783 screenshare.call.send_side_bwe = true;
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59784 screenshare.screenshare[0] = {true, false, 10};
Ilya Nikolaevskiydda5fdc2019-02-27 09:00:06785 screenshare.video[0] = {true, 1850, 1110, 30, 800000, 2500000,
Ilya Nikolaevskiyaec663e2019-02-27 11:52:11786 2500000, false, "VP8", 2, 1, 400000,
Ilya Nikolaevskiydda5fdc2019-02-27 09:00:06787 false, false, false, ""};
ilnikcb8c1462017-03-09 17:23:30788 screenshare.analyzer = {"screenshare_slides_simulcast", 0.0, 0.0,
789 kFullStackTestDurationSecs};
Patrik Höglundb6b29e02018-06-21 14:58:01790 ParamsWithLogging screenshare_params_high;
Ilya Nikolaevskiydda5fdc2019-02-27 09:00:06791 screenshare_params_high.video[0] = {
792 true, 1850, 1110, 60, 600000, 1250000, 1250000, false,
793 "VP8", 2, 0, 400000, false, false, false, ""};
ilnikcb8c1462017-03-09 17:23:30794 VideoQualityTest::Params screenshare_params_low;
Ilya Nikolaevskiydda5fdc2019-02-27 09:00:06795 screenshare_params_low.video[0] = {true, 1850, 1110, 5, 30000, 200000,
Erik Språng28bb3912018-07-11 14:06:55796 1000000, false, "VP8", 2, 0, 400000,
797 false, false, false, ""};
ilnikcb8c1462017-03-09 17:23:30798
799 std::vector<VideoStream> streams = {
Patrik Höglundb6b29e02018-06-21 14:58:01800 VideoQualityTest::DefaultVideoStream(screenshare_params_low, 0),
801 VideoQualityTest::DefaultVideoStream(screenshare_params_high, 0)};
Sergey Silkin57027362018-05-15 07:12:05802 screenshare.ss[0] = {
803 streams, 1, 1, 0, InterLayerPredMode::kOn, std::vector<SpatialLayer>(),
804 false};
Danil Chapovalovbeddb152025-06-16 16:25:10805 fixture.RunWithAnalyzer(screenshare);
ilnikcb8c1462017-03-09 17:23:30806}
Ilya Nikolaevskiy7b412252019-03-06 15:40:42807
Florent Castelli66b38602019-07-10 14:57:57808#endif // !defined(WEBRTC_MAC) && !defined(WEBRTC_WIN)
ilnikcb8c1462017-03-09 17:23:30809
Jeremy Lecontec8850cb2020-09-10 18:46:33810TEST(FullStackTest, Screenshare_Slides_Scrolling) {
Danil Chapovalovbeddb152025-06-16 16:25:10811 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:01812 ParamsWithLogging config;
minyue626bc952016-10-31 12:47:02813 config.call.send_side_bwe = true;
Erik Språng28bb3912018-07-11 14:06:55814 config.video[0] = {true, 1850, 1110 / 2, 5, 50000, 200000,
815 1000000, false, "VP8", 2, 1, 400000,
816 false, false, false, ""};
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59817 config.screenshare[0] = {true, false, 10, 2};
minyue626bc952016-10-31 12:47:02818 config.analyzer = {"screenshare_slides_scrolling", 0.0, 0.0,
819 kFullStackTestDurationSecs};
Danil Chapovalovbeddb152025-06-16 16:25:10820 fixture.RunWithAnalyzer(config);
ivica028cf482015-07-30 09:15:56821}
822
Jeremy Lecontec8850cb2020-09-10 18:46:33823TEST(GenericDescriptorTest, Screenshare_Slides_Lossy_Net_Generic_Descriptor) {
Danil Chapovalovbeddb152025-06-16 16:25:10824 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:01825 ParamsWithLogging screenshare;
minyue626bc952016-10-31 12:47:02826 screenshare.call.send_side_bwe = true;
Erik Språng28bb3912018-07-11 14:06:55827 screenshare.video[0] = {true, 1850, 1110, 5, 50000, 200000,
828 1000000, false, "VP8", 2, 1, 400000,
829 false, false, false, ""};
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59830 screenshare.screenshare[0] = {true, false, 10};
Danil Chapovalov636865e2020-06-03 12:11:26831 screenshare.analyzer = {"screenshare_slides_lossy_net_generic_descriptor",
832 0.0, 0.0, kFullStackTestDurationSecs};
Artem Titovf18b3522018-08-28 14:54:24833 screenshare.config->loss_percent = 5;
834 screenshare.config->queue_delay_ms = 200;
Per K5566b912024-05-15 15:53:02835 screenshare.config->link_capacity = DataRate::KilobitsPerSec(500);
Danil Chapovalov636865e2020-06-03 12:11:26836 screenshare.call.generic_descriptor = true;
Danil Chapovalovbeddb152025-06-16 16:25:10837 fixture.RunWithAnalyzer(screenshare);
sprangee37de32015-11-23 14:10:23838}
839
Jeremy Lecontec8850cb2020-09-10 18:46:33840TEST(FullStackTest, Screenshare_Slides_Very_Lossy) {
Danil Chapovalovbeddb152025-06-16 16:25:10841 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:01842 ParamsWithLogging screenshare;
minyue626bc952016-10-31 12:47:02843 screenshare.call.send_side_bwe = true;
Erik Språng28bb3912018-07-11 14:06:55844 screenshare.video[0] = {true, 1850, 1110, 5, 50000, 200000,
845 1000000, false, "VP8", 2, 1, 400000,
846 false, false, false, ""};
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59847 screenshare.screenshare[0] = {true, false, 10};
minyue626bc952016-10-31 12:47:02848 screenshare.analyzer = {"screenshare_slides_very_lossy", 0.0, 0.0,
849 kFullStackTestDurationSecs};
Artem Titovf18b3522018-08-28 14:54:24850 screenshare.config->loss_percent = 10;
851 screenshare.config->queue_delay_ms = 200;
Per K5566b912024-05-15 15:53:02852 screenshare.config->link_capacity = DataRate::KilobitsPerSec(500);
Danil Chapovalovbeddb152025-06-16 16:25:10853 fixture.RunWithAnalyzer(screenshare);
sprangee37de32015-11-23 14:10:23854}
855
Jeremy Lecontec8850cb2020-09-10 18:46:33856TEST(FullStackTest, Screenshare_Slides_Lossy_Limited) {
Danil Chapovalovbeddb152025-06-16 16:25:10857 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:01858 ParamsWithLogging screenshare;
sprange566e172017-06-08 08:29:15859 screenshare.call.send_side_bwe = true;
Erik Språng28bb3912018-07-11 14:06:55860 screenshare.video[0] = {true, 1850, 1110, 5, 50000, 200000,
861 1000000, false, "VP8", 2, 1, 400000,
862 false, false, false, ""};
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59863 screenshare.screenshare[0] = {true, false, 10};
sprange566e172017-06-08 08:29:15864 screenshare.analyzer = {"screenshare_slides_lossy_limited", 0.0, 0.0,
865 kFullStackTestDurationSecs};
Artem Titovf18b3522018-08-28 14:54:24866 screenshare.config->loss_percent = 5;
Per K5566b912024-05-15 15:53:02867 screenshare.config->link_capacity = DataRate::KilobitsPerSec(200);
Artem Titovf18b3522018-08-28 14:54:24868 screenshare.config->queue_length_packets = 30;
sprange566e172017-06-08 08:29:15869
Danil Chapovalovbeddb152025-06-16 16:25:10870 fixture.RunWithAnalyzer(screenshare);
sprange566e172017-06-08 08:29:15871}
872
Jeremy Lecontec8850cb2020-09-10 18:46:33873TEST(FullStackTest, Screenshare_Slides_Moderately_Restricted) {
Danil Chapovalovbeddb152025-06-16 16:25:10874 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:01875 ParamsWithLogging screenshare;
sprang89c4a7e2017-06-30 20:27:40876 screenshare.call.send_side_bwe = true;
Erik Språng28bb3912018-07-11 14:06:55877 screenshare.video[0] = {true, 1850, 1110, 5, 50000, 200000,
878 1000000, false, "VP8", 2, 1, 400000,
879 false, false, false, ""};
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59880 screenshare.screenshare[0] = {true, false, 10};
sprang89c4a7e2017-06-30 20:27:40881 screenshare.analyzer = {"screenshare_slides_moderately_restricted", 0.0, 0.0,
882 kFullStackTestDurationSecs};
Artem Titovf18b3522018-08-28 14:54:24883 screenshare.config->loss_percent = 1;
Per K5566b912024-05-15 15:53:02884 screenshare.config->link_capacity = DataRate::KilobitsPerSec(1200);
Artem Titovf18b3522018-08-28 14:54:24885 screenshare.config->queue_length_packets = 30;
sprang89c4a7e2017-06-30 20:27:40886
Danil Chapovalovbeddb152025-06-16 16:25:10887 fixture.RunWithAnalyzer(screenshare);
sprang89c4a7e2017-06-30 20:27:40888}
889
Rasmus Brandt3c589be2019-03-13 10:32:40890// Since ParamsWithLogging::Video is not trivially destructible, we can't
891// store these structs as const globals.
892ParamsWithLogging::Video SvcVp9Video() {
893 return ParamsWithLogging::Video{
894 true, 1280,
895 720, 30,
896 800000, 2500000,
897 2500000, false,
898 "VP9", 3,
899 2, 400000,
900 false, false,
901 false, ClipNameToClipPath("ConferenceMotion_1280_720_50")};
902}
ilnik566c43b2017-03-07 12:42:54903
Rasmus Brandt3c589be2019-03-13 10:32:40904ParamsWithLogging::Video SimulcastVp8VideoHigh() {
905 return ParamsWithLogging::Video{
906 true, 1280,
907 720, 30,
908 800000, 2500000,
909 2500000, false,
910 "VP8", 3,
911 2, 400000,
912 false, false,
913 false, ClipNameToClipPath("ConferenceMotion_1280_720_50")};
914}
ilnik566c43b2017-03-07 12:42:54915
Rasmus Brandt3c589be2019-03-13 10:32:40916ParamsWithLogging::Video SimulcastVp8VideoMedium() {
917 return ParamsWithLogging::Video{
918 true, 640,
919 360, 30,
920 150000, 500000,
921 700000, false,
922 "VP8", 3,
923 2, 400000,
924 false, false,
925 false, ClipNameToClipPath("ConferenceMotion_1280_720_50")};
926}
ilnik566c43b2017-03-07 12:42:54927
Rasmus Brandt3c589be2019-03-13 10:32:40928ParamsWithLogging::Video SimulcastVp8VideoLow() {
929 return ParamsWithLogging::Video{
930 true, 320,
931 180, 30,
932 30000, 150000,
933 200000, false,
934 "VP8", 3,
935 2, 400000,
936 false, false,
937 false, ClipNameToClipPath("ConferenceMotion_1280_720_50")};
938}
ilnik566c43b2017-03-07 12:42:54939
Mirko Bonadei8ef57932018-11-16 13:38:03940#if defined(RTC_ENABLE_VP9)
Ilya Nikolaevskiy61170682019-03-06 15:04:32941
Jeremy Leconte4100d552020-09-11 16:02:36942TEST(FullStackTest, Screenshare_Slides_Vp9_3sl_High_Fps) {
Danil Chapovalovbeddb152025-06-16 16:25:10943 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:01944 ParamsWithLogging screenshare;
minyue626bc952016-10-31 12:47:02945 screenshare.call.send_side_bwe = true;
Ilya Nikolaevskiy61170682019-03-06 15:04:32946 screenshare.video[0] = {true, 1850, 1110, 30, 50000, 200000,
947 2000000, false, "VP9", 1, 0, 400000,
948 false, false, false, ""};
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59949 screenshare.screenshare[0] = {true, false, 10};
Ilya Nikolaevskiy61170682019-03-06 15:04:32950 screenshare.analyzer = {"screenshare_slides_vp9_3sl_high_fps", 0.0, 0.0,
minyue626bc952016-10-31 12:47:02951 kFullStackTestDurationSecs};
Sergey Silkin57027362018-05-15 07:12:05952 screenshare.ss[0] = {
Ilya Nikolaevskiy61170682019-03-06 15:04:32953 std::vector<VideoStream>(), 0, 3, 2, InterLayerPredMode::kOn,
954 std::vector<SpatialLayer>(), true};
Danil Chapovalovbeddb152025-06-16 16:25:10955 fixture.RunWithAnalyzer(screenshare);
Ilya Nikolaevskiy61170682019-03-06 15:04:32956}
957
Patrik Höglundf6767ed2020-03-13 11:45:32958// TODO(http://bugs.webrtc.org/9506): investigate.
Sergey Silkin7f978f12018-09-10 12:01:49959#if !defined(WEBRTC_MAC)
960
Jeremy Leconte4100d552020-09-11 16:02:36961TEST(FullStackTest, Vp9ksvc_3sl_High) {
Danil Chapovalovbeddb152025-06-16 16:25:10962 VideoQualityTest fixture(
963 {.field_trials = "WebRTC-Vp9IssueKeyFrameOnLayerDeactivation/Enabled/"});
Patrik Höglundb6b29e02018-06-21 14:58:01964 ParamsWithLogging simulcast;
Sergey Silkin0643fd62018-05-17 10:50:53965 simulcast.call.send_side_bwe = true;
Rasmus Brandt3c589be2019-03-13 10:32:40966 simulcast.video[0] = SvcVp9Video();
Sergey Silkin0643fd62018-05-17 10:50:53967 simulcast.analyzer = {"vp9ksvc_3sl_high", 0.0, 0.0,
968 kFullStackTestDurationSecs};
969 simulcast.ss[0] = {
970 std::vector<VideoStream>(), 0, 3, 2, InterLayerPredMode::kOnKeyPic,
971 std::vector<SpatialLayer>(), false};
Danil Chapovalovbeddb152025-06-16 16:25:10972 fixture.RunWithAnalyzer(simulcast);
Sergey Silkin0643fd62018-05-17 10:50:53973}
974
Jeremy Leconte4100d552020-09-11 16:02:36975TEST(FullStackTest, Vp9ksvc_3sl_Low) {
Danil Chapovalovbeddb152025-06-16 16:25:10976 VideoQualityTest fixture(
977 {.field_trials = "WebRTC-Vp9IssueKeyFrameOnLayerDeactivation/Enabled/"});
Patrik Höglundb6b29e02018-06-21 14:58:01978 ParamsWithLogging simulcast;
Sergey Silkin0643fd62018-05-17 10:50:53979 simulcast.call.send_side_bwe = true;
Rasmus Brandt3c589be2019-03-13 10:32:40980 simulcast.video[0] = SvcVp9Video();
Sergey Silkin0643fd62018-05-17 10:50:53981 simulcast.analyzer = {"vp9ksvc_3sl_low", 0.0, 0.0,
982 kFullStackTestDurationSecs};
983 simulcast.ss[0] = {
984 std::vector<VideoStream>(), 0, 3, 0, InterLayerPredMode::kOnKeyPic,
985 std::vector<SpatialLayer>(), false};
Danil Chapovalovbeddb152025-06-16 16:25:10986 fixture.RunWithAnalyzer(simulcast);
Sergey Silkin0643fd62018-05-17 10:50:53987}
“Michael277a6562018-06-01 19:09:19988
Jeremy Leconte4100d552020-09-11 16:02:36989TEST(FullStackTest, Vp9ksvc_3sl_Low_Bw_Limited) {
Danil Chapovalovbeddb152025-06-16 16:25:10990 VideoQualityTest fixture(
991 {.field_trials = "WebRTC-Vp9IssueKeyFrameOnLayerDeactivation/Enabled/"});
Ilya Nikolaevskiyef0033b2020-02-25 12:59:08992 ParamsWithLogging simulcast;
Per K5566b912024-05-15 15:53:02993 simulcast.config->link_capacity = DataRate::KilobitsPerSec(500);
Ilya Nikolaevskiyef0033b2020-02-25 12:59:08994 simulcast.call.send_side_bwe = true;
995 simulcast.video[0] = SvcVp9Video();
996 simulcast.analyzer = {"vp9ksvc_3sl_low_bw_limited", 0.0, 0.0,
997 kFullStackTestDurationSecs};
998 simulcast.ss[0] = {
999 std::vector<VideoStream>(), 0, 3, 0, InterLayerPredMode::kOnKeyPic,
1000 std::vector<SpatialLayer>(), false};
Danil Chapovalovbeddb152025-06-16 16:25:101001 fixture.RunWithAnalyzer(simulcast);
Ilya Nikolaevskiyef0033b2020-02-25 12:59:081002}
1003
Jeremy Leconte4100d552020-09-11 16:02:361004TEST(FullStackTest, Vp9ksvc_3sl_Medium_Network_Restricted) {
Danil Chapovalovbeddb152025-06-16 16:25:101005 VideoQualityTest fixture(
1006 {.field_trials = "WebRTC-Vp9IssueKeyFrameOnLayerDeactivation/Enabled/"});
Niels Möller0e909822018-08-21 15:34:351007 ParamsWithLogging simulcast;
“Michael277a6562018-06-01 19:09:191008 simulcast.call.send_side_bwe = true;
Rasmus Brandt3c589be2019-03-13 10:32:401009 simulcast.video[0] = SvcVp9Video();
“Michael277a6562018-06-01 19:09:191010 simulcast.analyzer = {"vp9ksvc_3sl_medium_network_restricted", 0.0, 0.0,
1011 kFullStackTestDurationSecs};
1012 simulcast.ss[0] = {
Sergey Silkine7ce8882018-10-03 16:04:571013 std::vector<VideoStream>(), 0, 3, -1, InterLayerPredMode::kOnKeyPic,
“Michael277a6562018-06-01 19:09:191014 std::vector<SpatialLayer>(), false};
Per K5566b912024-05-15 15:53:021015 simulcast.config->link_capacity = DataRate::KilobitsPerSec(1000);
Sergey Silkine7ce8882018-10-03 16:04:571016 simulcast.config->queue_delay_ms = 100;
Danil Chapovalovbeddb152025-06-16 16:25:101017 fixture.RunWithAnalyzer(simulcast);
“Michael277a6562018-06-01 19:09:191018}
Erik Språngd3438aa2018-11-08 15:56:431019
1020// TODO(webrtc:9722): Remove when experiment is cleaned up.
Jeremy Leconte4100d552020-09-11 16:02:361021TEST(FullStackTest, Vp9ksvc_3sl_Medium_Network_Restricted_Trusted_Rate) {
Danil Chapovalovbeddb152025-06-16 16:25:101022 VideoQualityTest fixture(
1023 {.field_trials = "WebRTC-Vp9IssueKeyFrameOnLayerDeactivation/Enabled/"});
Erik Språngd3438aa2018-11-08 15:56:431024 ParamsWithLogging simulcast;
1025 simulcast.call.send_side_bwe = true;
Rasmus Brandt3c589be2019-03-13 10:32:401026 simulcast.video[0] = SvcVp9Video();
Erik Språngd3438aa2018-11-08 15:56:431027 simulcast.analyzer = {"vp9ksvc_3sl_medium_network_restricted_trusted_rate",
1028 0.0, 0.0, kFullStackTestDurationSecs};
1029 simulcast.ss[0] = {
1030 std::vector<VideoStream>(), 0, 3, -1, InterLayerPredMode::kOnKeyPic,
1031 std::vector<SpatialLayer>(), false};
Per K5566b912024-05-15 15:53:021032 simulcast.config->link_capacity = DataRate::KilobitsPerSec(1000);
Erik Språngd3438aa2018-11-08 15:56:431033 simulcast.config->queue_delay_ms = 100;
Danil Chapovalovbeddb152025-06-16 16:25:101034 fixture.RunWithAnalyzer(simulcast);
Erik Språngd3438aa2018-11-08 15:56:431035}
Sergey Silkin7f978f12018-09-10 12:01:491036#endif // !defined(WEBRTC_MAC)
1037
Mirko Bonadei8ef57932018-11-16 13:38:031038#endif // defined(RTC_ENABLE_VP9)
brandtr93c5d032016-11-30 15:50:071039
ilnik6b826ef2017-06-16 13:53:481040// Android bots can't handle FullHD, so disable the test.
Ilya Nikolaevskiy7e5203f2018-09-10 12:04:501041// TODO(bugs.webrtc.org/9220): Investigate source of flakiness on Mac.
1042#if defined(WEBRTC_ANDROID) || defined(WEBRTC_MAC)
Jeremy Lecontec8850cb2020-09-10 18:46:331043#define MAYBE_Simulcast_HD_High DISABLED_Simulcast_HD_High
ilnik6b826ef2017-06-16 13:53:481044#else
Jeremy Lecontec8850cb2020-09-10 18:46:331045#define MAYBE_Simulcast_HD_High Simulcast_HD_High
ilnik6b826ef2017-06-16 13:53:481046#endif
1047
Jeremy Lecontec8850cb2020-09-10 18:46:331048TEST(FullStackTest, MAYBE_Simulcast_HD_High) {
Danil Chapovalovbeddb152025-06-16 16:25:101049 VideoQualityTest fixture(
1050 {.field_trials =
1051 "WebRTC-ForceSimulatedOveruseIntervalMs/1000-50000-300/"});
Patrik Höglundb6b29e02018-06-21 14:58:011052 ParamsWithLogging simulcast;
ilnik6b826ef2017-06-16 13:53:481053 simulcast.call.send_side_bwe = true;
Jonas Olssona4d87372019-07-05 17:08:331054 simulcast.video[0] = {true, 1920, 1080, 30, 800000, 2500000,
1055 2500000, false, "VP8", 3, 2, 400000,
1056 false, false, false, "Generator"};
ilnik6b826ef2017-06-16 13:53:481057 simulcast.analyzer = {"simulcast_HD_high", 0.0, 0.0,
1058 kFullStackTestDurationSecs};
Artem Titovf18b3522018-08-28 14:54:241059 simulcast.config->loss_percent = 0;
1060 simulcast.config->queue_delay_ms = 100;
Patrik Höglundb6b29e02018-06-21 14:58:011061 std::vector<VideoStream> streams = {
Jonas Olssona4d87372019-07-05 17:08:331062 VideoQualityTest::DefaultVideoStream(simulcast, 0),
1063 VideoQualityTest::DefaultVideoStream(simulcast, 0),
1064 VideoQualityTest::DefaultVideoStream(simulcast, 0)};
Sergey Silkin57027362018-05-15 07:12:051065 simulcast.ss[0] = {
1066 streams, 2, 1, 0, InterLayerPredMode::kOn, std::vector<SpatialLayer>(),
1067 true};
Danil Chapovalovbeddb152025-06-16 16:25:101068 fixture.RunWithAnalyzer(simulcast);
ilnik6b826ef2017-06-16 13:53:481069}
1070
Jeremy Leconte4100d552020-09-11 16:02:361071TEST(FullStackTest, Simulcast_Vp8_3sl_High) {
Danil Chapovalovbeddb152025-06-16 16:25:101072 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:011073 ParamsWithLogging simulcast;
ilnik3dd5ad92017-02-09 12:58:531074 simulcast.call.send_side_bwe = true;
Rasmus Brandt3c589be2019-03-13 10:32:401075 simulcast.video[0] = SimulcastVp8VideoHigh();
ilnik2a8c2f52017-02-15 10:23:281076 simulcast.analyzer = {"simulcast_vp8_3sl_high", 0.0, 0.0,
ilnik3dd5ad92017-02-09 12:58:531077 kFullStackTestDurationSecs};
Artem Titovf18b3522018-08-28 14:54:241078 simulcast.config->loss_percent = 0;
1079 simulcast.config->queue_delay_ms = 100;
Patrik Höglundb6b29e02018-06-21 14:58:011080 ParamsWithLogging video_params_high;
Rasmus Brandt3c589be2019-03-13 10:32:401081 video_params_high.video[0] = SimulcastVp8VideoHigh();
Patrik Höglundb6b29e02018-06-21 14:58:011082 ParamsWithLogging video_params_medium;
Rasmus Brandt3c589be2019-03-13 10:32:401083 video_params_medium.video[0] = SimulcastVp8VideoMedium();
Patrik Höglundb6b29e02018-06-21 14:58:011084 ParamsWithLogging video_params_low;
Rasmus Brandt3c589be2019-03-13 10:32:401085 video_params_low.video[0] = SimulcastVp8VideoLow();
ilnik3dd5ad92017-02-09 12:58:531086
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:591087 std::vector<VideoStream> streams = {
Patrik Höglundb6b29e02018-06-21 14:58:011088 VideoQualityTest::DefaultVideoStream(video_params_low, 0),
1089 VideoQualityTest::DefaultVideoStream(video_params_medium, 0),
1090 VideoQualityTest::DefaultVideoStream(video_params_high, 0)};
Sergey Silkin57027362018-05-15 07:12:051091 simulcast.ss[0] = {
1092 streams, 2, 1, 0, InterLayerPredMode::kOn, std::vector<SpatialLayer>(),
1093 false};
Danil Chapovalovbeddb152025-06-16 16:25:101094 fixture.RunWithAnalyzer(simulcast);
ilnik3dd5ad92017-02-09 12:58:531095}
1096
Jeremy Leconte4100d552020-09-11 16:02:361097TEST(FullStackTest, Simulcast_Vp8_3sl_Low) {
Danil Chapovalovbeddb152025-06-16 16:25:101098 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:011099 ParamsWithLogging simulcast;
ilnik3dd5ad92017-02-09 12:58:531100 simulcast.call.send_side_bwe = true;
Rasmus Brandt3c589be2019-03-13 10:32:401101 simulcast.video[0] = SimulcastVp8VideoHigh();
ilnik2a8c2f52017-02-15 10:23:281102 simulcast.analyzer = {"simulcast_vp8_3sl_low", 0.0, 0.0,
ilnik3dd5ad92017-02-09 12:58:531103 kFullStackTestDurationSecs};
Artem Titovf18b3522018-08-28 14:54:241104 simulcast.config->loss_percent = 0;
1105 simulcast.config->queue_delay_ms = 100;
Patrik Höglundb6b29e02018-06-21 14:58:011106 ParamsWithLogging video_params_high;
Rasmus Brandt3c589be2019-03-13 10:32:401107 video_params_high.video[0] = SimulcastVp8VideoHigh();
Patrik Höglundb6b29e02018-06-21 14:58:011108 ParamsWithLogging video_params_medium;
Rasmus Brandt3c589be2019-03-13 10:32:401109 video_params_medium.video[0] = SimulcastVp8VideoMedium();
Patrik Höglundb6b29e02018-06-21 14:58:011110 ParamsWithLogging video_params_low;
Rasmus Brandt3c589be2019-03-13 10:32:401111 video_params_low.video[0] = SimulcastVp8VideoLow();
ilnik3dd5ad92017-02-09 12:58:531112
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:591113 std::vector<VideoStream> streams = {
Patrik Höglundb6b29e02018-06-21 14:58:011114 VideoQualityTest::DefaultVideoStream(video_params_low, 0),
1115 VideoQualityTest::DefaultVideoStream(video_params_medium, 0),
1116 VideoQualityTest::DefaultVideoStream(video_params_high, 0)};
Sergey Silkin57027362018-05-15 07:12:051117 simulcast.ss[0] = {
1118 streams, 0, 1, 0, InterLayerPredMode::kOn, std::vector<SpatialLayer>(),
1119 false};
Danil Chapovalovbeddb152025-06-16 16:25:101120 fixture.RunWithAnalyzer(simulcast);
ilnik3dd5ad92017-02-09 12:58:531121}
1122
Emircan Uysaler7c03bdc2019-01-16 20:07:561123// This test assumes ideal network conditions with target bandwidth being
1124// available and exercises WebRTC calls with a high target bitrate(100 Mbps).
1125// Android32 bots can't handle this high bitrate, so disable test for those.
1126#if defined(WEBRTC_ANDROID)
Jeremy Lecontec8850cb2020-09-10 18:46:331127#define MAYBE_High_Bitrate_With_Fake_Codec DISABLED_High_Bitrate_With_Fake_Codec
Emircan Uysaler7c03bdc2019-01-16 20:07:561128#else
Jeremy Lecontec8850cb2020-09-10 18:46:331129#define MAYBE_High_Bitrate_With_Fake_Codec High_Bitrate_With_Fake_Codec
Emircan Uysaler7c03bdc2019-01-16 20:07:561130#endif // defined(WEBRTC_ANDROID)
Jeremy Lecontec8850cb2020-09-10 18:46:331131TEST(FullStackTest, MAYBE_High_Bitrate_With_Fake_Codec) {
Danil Chapovalovbeddb152025-06-16 16:25:101132 VideoQualityTest fixture;
Emircan Uysaler7c03bdc2019-01-16 20:07:561133 const int target_bitrate = 100000000;
1134 ParamsWithLogging generator;
1135 generator.call.send_side_bwe = true;
1136 generator.call.call_bitrate_config.min_bitrate_bps = target_bitrate;
1137 generator.call.call_bitrate_config.start_bitrate_bps = target_bitrate;
1138 generator.call.call_bitrate_config.max_bitrate_bps = target_bitrate;
1139 generator.video[0] = {true,
1140 360,
1141 240,
1142 30,
1143 target_bitrate / 2,
1144 target_bitrate,
1145 target_bitrate * 2,
1146 false,
1147 "FakeCodec",
1148 1,
1149 0,
1150 0,
1151 false,
1152 false,
1153 false,
1154 "Generator"};
1155 generator.analyzer = {"high_bitrate_with_fake_codec", 0.0, 0.0,
1156 kFullStackTestDurationSecs};
Danil Chapovalovbeddb152025-06-16 16:25:101157 fixture.RunWithAnalyzer(generator);
Emircan Uysaler7c03bdc2019-01-16 20:07:561158}
1159
oprypin743117f2017-09-15 12:24:241160#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
1161// Fails on mobile devices:
ilnikf89a7382017-03-07 14:15:271162// https://bugs.chromium.org/p/webrtc/issues/detail?id=7301
Jeremy Leconte4100d552020-09-11 16:02:361163#define MAYBE_Largeroom_50thumb DISABLED_Largeroom_50thumb
ilnikf89a7382017-03-07 14:15:271164#else
Jeremy Leconte4100d552020-09-11 16:02:361165#define MAYBE_Largeroom_50thumb Largeroom_50thumb
ilnikf89a7382017-03-07 14:15:271166#endif
1167
Jeremy Leconte4100d552020-09-11 16:02:361168TEST(FullStackTest, MAYBE_Largeroom_50thumb) {
Danil Chapovalovbeddb152025-06-16 16:25:101169 VideoQualityTest fixture;
Patrik Höglundb6b29e02018-06-21 14:58:011170 ParamsWithLogging large_room;
ilnika014cc52017-03-07 12:21:041171 large_room.call.send_side_bwe = true;
Rasmus Brandt3c589be2019-03-13 10:32:401172 large_room.video[0] = SimulcastVp8VideoHigh();
ilnika014cc52017-03-07 12:21:041173 large_room.analyzer = {"largeroom_50thumb", 0.0, 0.0,
1174 kFullStackTestDurationSecs};
Artem Titovf18b3522018-08-28 14:54:241175 large_room.config->loss_percent = 0;
1176 large_room.config->queue_delay_ms = 100;
Patrik Höglundb6b29e02018-06-21 14:58:011177 ParamsWithLogging video_params_high;
Rasmus Brandt3c589be2019-03-13 10:32:401178 video_params_high.video[0] = SimulcastVp8VideoHigh();
Patrik Höglundb6b29e02018-06-21 14:58:011179 ParamsWithLogging video_params_medium;
Rasmus Brandt3c589be2019-03-13 10:32:401180 video_params_medium.video[0] = SimulcastVp8VideoMedium();
Patrik Höglundb6b29e02018-06-21 14:58:011181 ParamsWithLogging video_params_low;
Rasmus Brandt3c589be2019-03-13 10:32:401182 video_params_low.video[0] = SimulcastVp8VideoLow();
ilnika014cc52017-03-07 12:21:041183
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:591184 std::vector<VideoStream> streams = {
Patrik Höglundb6b29e02018-06-21 14:58:011185 VideoQualityTest::DefaultVideoStream(video_params_low, 0),
1186 VideoQualityTest::DefaultVideoStream(video_params_medium, 0),
1187 VideoQualityTest::DefaultVideoStream(video_params_high, 0)};
ilnik98436952017-07-13 07:47:031188 large_room.call.num_thumbnails = 50;
Sergey Silkin57027362018-05-15 07:12:051189 large_room.ss[0] = {
1190 streams, 2, 1, 0, InterLayerPredMode::kOn, std::vector<SpatialLayer>(),
1191 false};
Danil Chapovalovbeddb152025-06-16 16:25:101192 fixture.RunWithAnalyzer(large_room);
ilnika014cc52017-03-07 12:21:041193}
1194
pbos@webrtc.orgaf8d5af2013-07-09 08:02:331195} // namespace webrtc