blob: 8a6029cee41b71ab9320ac407167a7cc72c5af64 [file] [log] [blame]
Artem Titov137f6c82019-05-17 10:51:15 +02001/*
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 */
10#include <memory>
11#include <string>
12#include <utility>
13#include <vector>
14
Andrey Logvin435fb9a2020-05-08 08:02:49 +000015#include "api/media_stream_interface.h"
Artem Titov137f6c82019-05-17 10:51:15 +020016#include "api/test/create_network_emulation_manager.h"
Andrey Logvinc0644672020-05-05 10:33:01 +000017#include "api/test/create_peer_connection_quality_test_frame_generator.h"
Artem Titov137f6c82019-05-17 10:51:15 +020018#include "api/test/create_peerconnection_quality_test_fixture.h"
Andrey Logvinc0644672020-05-05 10:33:01 +000019#include "api/test/frame_generator_interface.h"
Artem Titov137f6c82019-05-17 10:51:15 +020020#include "api/test/network_emulation_manager.h"
21#include "api/test/peerconnection_quality_test_fixture.h"
22#include "api/test/simulated_network.h"
23#include "call/simulated_network.h"
24#include "media/base/vp9_profile.h"
25#include "modules/video_coding/codecs/vp9/include/vp9.h"
26#include "system_wrappers/include/field_trial.h"
27#include "test/field_trial.h"
28#include "test/gtest.h"
29#include "test/pc/e2e/network_quality_metrics_reporter.h"
30#include "test/testsupport/file_utils.h"
31
32namespace webrtc {
33
34using PeerConfigurer =
35 webrtc_pc_e2e::PeerConnectionE2EQualityTestFixture::PeerConfigurer;
36using RunParams = webrtc_pc_e2e::PeerConnectionE2EQualityTestFixture::RunParams;
37using VideoConfig =
38 webrtc_pc_e2e::PeerConnectionE2EQualityTestFixture::VideoConfig;
39using AudioConfig =
40 webrtc_pc_e2e::PeerConnectionE2EQualityTestFixture::AudioConfig;
Artem Titov39483c62019-07-19 17:03:52 +020041using ScreenShareConfig =
42 webrtc_pc_e2e::PeerConnectionE2EQualityTestFixture::ScreenShareConfig;
43using VideoSimulcastConfig =
44 webrtc_pc_e2e::PeerConnectionE2EQualityTestFixture::VideoSimulcastConfig;
Artem Titovcdd73e02020-01-23 14:09:09 +010045using VideoCodecConfig =
46 webrtc_pc_e2e::PeerConnectionE2EQualityTestFixture::VideoCodecConfig;
Artem Titov137f6c82019-05-17 10:51:15 +020047
48namespace {
49
50constexpr int kTestDurationSec = 45;
51constexpr char kVp8TrustedRateControllerFieldTrial[] =
52 "WebRTC-LibvpxVp8TrustedRateController/Enabled/";
53
54EmulatedNetworkNode* CreateEmulatedNodeWithConfig(
55 NetworkEmulationManager* emulation,
56 const BuiltInNetworkBehaviorConfig& config) {
57 return emulation->CreateEmulatedNode(
Mirko Bonadei317a1f02019-09-17 17:06:18 +020058 std::make_unique<SimulatedNetwork>(config));
Artem Titov137f6c82019-05-17 10:51:15 +020059}
60
61std::pair<EmulatedNetworkManagerInterface*, EmulatedNetworkManagerInterface*>
62CreateTwoNetworkLinks(NetworkEmulationManager* emulation,
63 const BuiltInNetworkBehaviorConfig& config) {
64 auto* alice_node = CreateEmulatedNodeWithConfig(emulation, config);
65 auto* bob_node = CreateEmulatedNodeWithConfig(emulation, config);
66
67 auto* alice_endpoint = emulation->CreateEndpoint(EmulatedEndpointConfig());
68 auto* bob_endpoint = emulation->CreateEndpoint(EmulatedEndpointConfig());
69
70 emulation->CreateRoute(alice_endpoint, {alice_node}, bob_endpoint);
71 emulation->CreateRoute(bob_endpoint, {bob_node}, alice_endpoint);
72
73 return {
74 emulation->CreateEmulatedNetworkManagerInterface({alice_endpoint}),
75 emulation->CreateEmulatedNetworkManagerInterface({bob_endpoint}),
76 };
77}
78
79std::unique_ptr<webrtc_pc_e2e::PeerConnectionE2EQualityTestFixture>
80CreateTestFixture(const std::string& test_case_name,
81 std::pair<EmulatedNetworkManagerInterface*,
82 EmulatedNetworkManagerInterface*> network_links,
83 rtc::FunctionView<void(PeerConfigurer*)> alice_configurer,
84 rtc::FunctionView<void(PeerConfigurer*)> bob_configurer) {
85 auto fixture = webrtc_pc_e2e::CreatePeerConnectionE2EQualityTestFixture(
86 test_case_name, /*audio_quality_analyzer=*/nullptr,
87 /*video_quality_analyzer=*/nullptr);
88 fixture->AddPeer(network_links.first->network_thread(),
89 network_links.first->network_manager(), alice_configurer);
90 fixture->AddPeer(network_links.second->network_thread(),
91 network_links.second->network_manager(), bob_configurer);
92 fixture->AddQualityMetricsReporter(
Mirko Bonadei317a1f02019-09-17 17:06:18 +020093 std::make_unique<webrtc_pc_e2e::NetworkQualityMetricsReporter>(
Artem Titov137f6c82019-05-17 10:51:15 +020094 network_links.first, network_links.second));
95 return fixture;
96}
97
98// Takes the current active field trials set, and appends some new trials.
99std::string AppendFieldTrials(std::string new_trial_string) {
100 return std::string(field_trial::GetFieldTrialString()) + new_trial_string;
101}
102
103std::string ClipNameToClipPath(const char* clip_name) {
104 return test::ResourcePath(clip_name, "yuv");
105}
106
107} // namespace
108
Artem Titov137f6c82019-05-17 10:51:15 +0200109#if defined(RTC_ENABLE_VP9)
110TEST(PCFullStackTest, ForemanCifWithoutPacketLossVp9) {
111 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
112 CreateNetworkEmulationManager();
113 auto fixture = CreateTestFixture(
114 "pc_foreman_cif_net_delay_0_0_plr_0_VP9",
115 CreateTwoNetworkLinks(network_emulation_manager.get(),
116 BuiltInNetworkBehaviorConfig()),
117 [](PeerConfigurer* alice) {
118 VideoConfig video(352, 288, 30);
Artem Titov137f6c82019-05-17 10:51:15 +0200119 video.stream_label = "alice-video";
Andrey Logvinc0644672020-05-05 10:33:01 +0000120 auto frame_generator = CreateFromYuvFileFrameGenerator(
121 video, ClipNameToClipPath("foreman_cif"));
122 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov137f6c82019-05-17 10:51:15 +0200123 },
124 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100125 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +0100126 run_params.video_codecs = {VideoCodecConfig(
127 /*name=*/cricket::kVp9CodecName, /*required_params=*/{
128 {kVP9FmtpProfileId, VP9ProfileToString(VP9Profile::kProfile0)}})};
Artem Titov137f6c82019-05-17 10:51:15 +0200129 run_params.use_flex_fec = false;
130 run_params.use_ulp_fec = false;
131 fixture->Run(std::move(run_params));
132}
133
Danil Chapovalov636865e2020-06-03 14:11:26 +0200134TEST(PCGenericDescriptorTest, ForemanCifPlr5Vp9) {
Artem Titov137f6c82019-05-17 10:51:15 +0200135 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
136 CreateNetworkEmulationManager();
137 BuiltInNetworkBehaviorConfig config;
138 config.loss_percent = 5;
139 config.queue_delay_ms = 50;
140 auto fixture = CreateTestFixture(
Danil Chapovalov636865e2020-06-03 14:11:26 +0200141 "pc_foreman_cif_delay_50_0_plr_5_VP9_generic_descriptor",
Artem Titov137f6c82019-05-17 10:51:15 +0200142 CreateTwoNetworkLinks(network_emulation_manager.get(), config),
143 [](PeerConfigurer* alice) {
144 VideoConfig video(352, 288, 30);
Artem Titov137f6c82019-05-17 10:51:15 +0200145 video.stream_label = "alice-video";
Andrey Logvinc0644672020-05-05 10:33:01 +0000146 auto frame_generator = CreateFromYuvFileFrameGenerator(
147 video, ClipNameToClipPath("foreman_cif"));
148 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov137f6c82019-05-17 10:51:15 +0200149 },
150 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100151 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +0100152 run_params.video_codecs = {VideoCodecConfig(
153 /*name=*/cricket::kVp9CodecName, /*required_params=*/{
154 {kVP9FmtpProfileId, VP9ProfileToString(VP9Profile::kProfile0)}})};
Artem Titov137f6c82019-05-17 10:51:15 +0200155 run_params.use_flex_fec = false;
156 run_params.use_ulp_fec = false;
157 fixture->Run(std::move(run_params));
158}
159
Artem Titove731a2e2019-07-02 10:08:17 +0200160// VP9 2nd profile isn't supported on android arm and arm 64.
Artem Titovcecee992019-07-03 11:55:28 +0200161#if (defined(WEBRTC_ANDROID) && \
162 (defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM))) || \
163 (defined(WEBRTC_IOS) && defined(WEBRTC_ARCH_ARM64))
Artem Titove731a2e2019-07-02 10:08:17 +0200164#define MAYBE_GeneratorWithoutPacketLossVp9Profile2 \
165 DISABLED_GeneratorWithoutPacketLossVp9Profile2
166#else
167#define MAYBE_GeneratorWithoutPacketLossVp9Profile2 \
168 GeneratorWithoutPacketLossVp9Profile2
169#endif
170TEST(PCFullStackTest, MAYBE_GeneratorWithoutPacketLossVp9Profile2) {
Artem Titov137f6c82019-05-17 10:51:15 +0200171 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
172 CreateNetworkEmulationManager();
173 auto fixture = CreateTestFixture(
174 "pc_generator_net_delay_0_0_plr_0_VP9Profile2",
175 CreateTwoNetworkLinks(network_emulation_manager.get(),
176 BuiltInNetworkBehaviorConfig()),
177 [](PeerConfigurer* alice) {
178 VideoConfig video(352, 288, 30);
Artem Titov137f6c82019-05-17 10:51:15 +0200179 video.stream_label = "alice-video";
Andrey Logvinc0644672020-05-05 10:33:01 +0000180 auto frame_generator = CreateSquareFrameGenerator(
181 video, test::FrameGeneratorInterface::OutputType::kI010);
182 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov137f6c82019-05-17 10:51:15 +0200183 },
184 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100185 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +0100186 run_params.video_codecs = {VideoCodecConfig(
187 /*name=*/cricket::kVp9CodecName, /*required_params=*/{
188 {kVP9FmtpProfileId, VP9ProfileToString(VP9Profile::kProfile2)}})};
Artem Titov137f6c82019-05-17 10:51:15 +0200189 run_params.use_flex_fec = false;
190 run_params.use_ulp_fec = false;
191 fixture->Run(std::move(run_params));
192}
193
194/*
195// TODO(bugs.webrtc.org/10639) migrate commented out test, when required
196// functionality will be supported in PeerConnection level framework.
197TEST(PCFullStackTest, ForemanCifWithoutPacketLossMultiplexI420Frame) {
198 auto fixture = CreateVideoQualityTestFixture();
199 ParamsWithLogging foreman_cif;
200 foreman_cif.call.send_side_bwe = true;
201 foreman_cif.video[0] = {
202 true, 352, 288, 30,
203 700000, 700000, 700000, false,
204 "multiplex", 1, 0, 0,
205 false, false, false, ClipNameToClipPath("foreman_cif")};
206 foreman_cif.analyzer = {"foreman_cif_net_delay_0_0_plr_0_Multiplex", 0.0, 0.0,
207 kTestDurationSec};
208 fixture->RunWithAnalyzer(foreman_cif);
209}
210
211TEST(PCFullStackTest, GeneratorWithoutPacketLossMultiplexI420AFrame) {
212 auto fixture = CreateVideoQualityTestFixture();
213
214 ParamsWithLogging generator;
215 generator.call.send_side_bwe = true;
216 generator.video[0] = {
217 true, 352, 288, 30, 700000, 700000, 700000, false,
218 "multiplex", 1, 0, 0, false, false, false, "GeneratorI420A"};
219 generator.analyzer = {"generator_net_delay_0_0_plr_0_Multiplex", 0.0, 0.0,
220 kTestDurationSec};
221 fixture->RunWithAnalyzer(generator);
222}
223*/
224#endif // defined(RTC_ENABLE_VP9)
225
226TEST(PCFullStackTest, ParisQcifWithoutPacketLoss) {
227 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
228 CreateNetworkEmulationManager();
229 auto fixture = CreateTestFixture(
230 "pc_net_delay_0_0_plr_0",
231 CreateTwoNetworkLinks(network_emulation_manager.get(),
232 BuiltInNetworkBehaviorConfig()),
233 [](PeerConfigurer* alice) {
234 VideoConfig video(176, 144, 30);
Artem Titov137f6c82019-05-17 10:51:15 +0200235 video.stream_label = "alice-video";
Andrey Logvinc0644672020-05-05 10:33:01 +0000236 auto frame_generator = CreateFromYuvFileFrameGenerator(
237 video, ClipNameToClipPath("paris_qcif"));
238 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov137f6c82019-05-17 10:51:15 +0200239 },
240 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100241 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +0100242 run_params.video_codecs = {VideoCodecConfig(cricket::kVp8CodecName)};
Artem Titov137f6c82019-05-17 10:51:15 +0200243 run_params.use_flex_fec = false;
244 run_params.use_ulp_fec = false;
245 fixture->Run(std::move(run_params));
246}
247
Danil Chapovalov636865e2020-06-03 14:11:26 +0200248TEST(PCGenericDescriptorTest, ForemanCifWithoutPacketLoss) {
Artem Titov137f6c82019-05-17 10:51:15 +0200249 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
250 CreateNetworkEmulationManager();
251 auto fixture = CreateTestFixture(
Danil Chapovalov636865e2020-06-03 14:11:26 +0200252 "pc_foreman_cif_net_delay_0_0_plr_0_generic_descriptor",
Artem Titov137f6c82019-05-17 10:51:15 +0200253 CreateTwoNetworkLinks(network_emulation_manager.get(),
254 BuiltInNetworkBehaviorConfig()),
255 [](PeerConfigurer* alice) {
256 VideoConfig video(352, 288, 30);
Artem Titov137f6c82019-05-17 10:51:15 +0200257 video.stream_label = "alice-video";
Andrey Logvinc0644672020-05-05 10:33:01 +0000258 auto frame_generator = CreateFromYuvFileFrameGenerator(
259 video, ClipNameToClipPath("foreman_cif"));
260 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov137f6c82019-05-17 10:51:15 +0200261 },
262 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100263 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +0100264 run_params.video_codecs = {VideoCodecConfig(cricket::kVp8CodecName)};
Artem Titov137f6c82019-05-17 10:51:15 +0200265 run_params.use_flex_fec = false;
266 run_params.use_ulp_fec = false;
267 fixture->Run(std::move(run_params));
268}
269
Danil Chapovalov636865e2020-06-03 14:11:26 +0200270TEST(PCGenericDescriptorTest, ForemanCif30kbpsWithoutPacketLoss) {
Artem Titov137f6c82019-05-17 10:51:15 +0200271 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
272 CreateNetworkEmulationManager();
273 BuiltInNetworkBehaviorConfig config;
Artem Titov137f6c82019-05-17 10:51:15 +0200274 auto fixture = CreateTestFixture(
Danil Chapovalov636865e2020-06-03 14:11:26 +0200275 "pc_foreman_cif_30kbps_net_delay_0_0_plr_0_generic_descriptor",
Artem Titov137f6c82019-05-17 10:51:15 +0200276 CreateTwoNetworkLinks(network_emulation_manager.get(), config),
277 [](PeerConfigurer* alice) {
278 VideoConfig video(352, 288, 10);
Artem Titov137f6c82019-05-17 10:51:15 +0200279 video.stream_label = "alice-video";
Andrey Logvinc0644672020-05-05 10:33:01 +0000280 auto frame_generator = CreateFromYuvFileFrameGenerator(
281 video, ClipNameToClipPath("foreman_cif"));
282 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov85a9d912019-05-29 14:36:50 +0200283
Niels Möller29d59a12020-06-22 14:48:10 +0200284 BitrateSettings bitrate_settings;
285 bitrate_settings.min_bitrate_bps = 30000;
286 bitrate_settings.start_bitrate_bps = 30000;
287 bitrate_settings.max_bitrate_bps = 30000;
288 alice->SetBitrateSettings(bitrate_settings);
Artem Titov137f6c82019-05-17 10:51:15 +0200289 },
290 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100291 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +0100292 run_params.video_codecs = {VideoCodecConfig(cricket::kVp8CodecName)};
Artem Titov137f6c82019-05-17 10:51:15 +0200293 run_params.use_flex_fec = false;
294 run_params.use_ulp_fec = false;
295 fixture->Run(std::move(run_params));
296}
297
298// TODO(webrtc:9722): Remove when experiment is cleaned up.
Danil Chapovalov636865e2020-06-03 14:11:26 +0200299TEST(PCGenericDescriptorTest,
300 ForemanCif30kbpsWithoutPacketLossTrustedRateControl) {
Artem Titov137f6c82019-05-17 10:51:15 +0200301 test::ScopedFieldTrials override_field_trials(
302 AppendFieldTrials(kVp8TrustedRateControllerFieldTrial));
303 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
304 CreateNetworkEmulationManager();
305 BuiltInNetworkBehaviorConfig config;
Artem Titov137f6c82019-05-17 10:51:15 +0200306 auto fixture = CreateTestFixture(
Danil Chapovalov636865e2020-06-03 14:11:26 +0200307 "pc_foreman_cif_30kbps_net_delay_0_0_plr_0_trusted_rate_ctrl_generic_"
308 "descriptor",
Artem Titov137f6c82019-05-17 10:51:15 +0200309 CreateTwoNetworkLinks(network_emulation_manager.get(), config),
310 [](PeerConfigurer* alice) {
311 VideoConfig video(352, 288, 10);
Artem Titov137f6c82019-05-17 10:51:15 +0200312 video.stream_label = "alice-video";
Andrey Logvinc0644672020-05-05 10:33:01 +0000313 auto frame_generator = CreateFromYuvFileFrameGenerator(
314 video, ClipNameToClipPath("foreman_cif"));
315 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov85a9d912019-05-29 14:36:50 +0200316
Niels Möller29d59a12020-06-22 14:48:10 +0200317 BitrateSettings bitrate_settings;
318 bitrate_settings.min_bitrate_bps = 30000;
319 bitrate_settings.start_bitrate_bps = 30000;
320 bitrate_settings.max_bitrate_bps = 30000;
321 alice->SetBitrateSettings(bitrate_settings);
Artem Titov137f6c82019-05-17 10:51:15 +0200322 },
323 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100324 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +0100325 run_params.video_codecs = {VideoCodecConfig(cricket::kVp8CodecName)};
Artem Titov137f6c82019-05-17 10:51:15 +0200326 run_params.use_flex_fec = false;
327 run_params.use_ulp_fec = false;
328 fixture->Run(std::move(run_params));
329}
330
331// Link capacity below default start rate.
332TEST(PCFullStackTest, ForemanCifLink150kbpsWithoutPacketLoss) {
333 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
334 CreateNetworkEmulationManager();
335 BuiltInNetworkBehaviorConfig config;
336 config.link_capacity_kbps = 150;
337 auto fixture = CreateTestFixture(
338 "pc_foreman_cif_link_150kbps_net_delay_0_0_plr_0",
339 CreateTwoNetworkLinks(network_emulation_manager.get(), config),
340 [](PeerConfigurer* alice) {
341 VideoConfig video(352, 288, 30);
Artem Titov137f6c82019-05-17 10:51:15 +0200342 video.stream_label = "alice-video";
Andrey Logvinc0644672020-05-05 10:33:01 +0000343 auto frame_generator = CreateFromYuvFileFrameGenerator(
344 video, ClipNameToClipPath("foreman_cif"));
345 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov137f6c82019-05-17 10:51:15 +0200346 },
347 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100348 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +0100349 run_params.video_codecs = {VideoCodecConfig(cricket::kVp8CodecName)};
Artem Titov137f6c82019-05-17 10:51:15 +0200350 run_params.use_flex_fec = false;
351 run_params.use_ulp_fec = false;
352 fixture->Run(std::move(run_params));
353}
354
Artem Titov65428262019-07-02 16:48:02 +0200355TEST(PCFullStackTest, ForemanCifLink130kbps100msDelay1PercentPacketLossUlpfec) {
356 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
357 CreateNetworkEmulationManager();
358 BuiltInNetworkBehaviorConfig config;
359 config.link_capacity_kbps = 130;
360 config.queue_delay_ms = 100;
361 config.loss_percent = 1;
362 auto fixture = CreateTestFixture(
363 "pc_foreman_cif_link_130kbps_delay100ms_loss1_ulpfec",
364 CreateTwoNetworkLinks(network_emulation_manager.get(), config),
365 [](PeerConfigurer* alice) {
366 VideoConfig video(352, 288, 30);
Artem Titov65428262019-07-02 16:48:02 +0200367 video.stream_label = "alice-video";
Andrey Logvinc0644672020-05-05 10:33:01 +0000368 auto frame_generator = CreateFromYuvFileFrameGenerator(
369 video, ClipNameToClipPath("foreman_cif"));
370 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov65428262019-07-02 16:48:02 +0200371 },
372 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100373 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +0100374 run_params.video_codecs = {VideoCodecConfig(cricket::kVp8CodecName)};
Artem Titov65428262019-07-02 16:48:02 +0200375 run_params.use_flex_fec = false;
376 run_params.use_ulp_fec = true;
377 fixture->Run(std::move(run_params));
378}
379
380TEST(PCFullStackTest, ForemanCifLink50kbps100msDelay1PercentPacketLossUlpfec) {
381 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
382 CreateNetworkEmulationManager();
383 BuiltInNetworkBehaviorConfig config;
384 config.link_capacity_kbps = 50;
385 config.queue_delay_ms = 100;
386 config.loss_percent = 1;
387 auto fixture = CreateTestFixture(
388 "pc_foreman_cif_link_50kbps_delay100ms_loss1_ulpfec",
389 CreateTwoNetworkLinks(network_emulation_manager.get(), config),
390 [](PeerConfigurer* alice) {
391 VideoConfig video(352, 288, 30);
Artem Titov65428262019-07-02 16:48:02 +0200392 video.stream_label = "alice-video";
Andrey Logvinc0644672020-05-05 10:33:01 +0000393 auto frame_generator = CreateFromYuvFileFrameGenerator(
394 video, ClipNameToClipPath("foreman_cif"));
395 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov65428262019-07-02 16:48:02 +0200396 },
397 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100398 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +0100399 run_params.video_codecs = {VideoCodecConfig(cricket::kVp8CodecName)};
Artem Titov65428262019-07-02 16:48:02 +0200400 run_params.use_flex_fec = false;
401 run_params.use_ulp_fec = true;
402 fixture->Run(std::move(run_params));
403}
404
Artem Titov137f6c82019-05-17 10:51:15 +0200405// Restricted network and encoder overproducing by 30%.
406TEST(PCFullStackTest, ForemanCifLink150kbpsBadRateController) {
407 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
408 CreateNetworkEmulationManager();
409 BuiltInNetworkBehaviorConfig config;
410 config.link_capacity_kbps = 150;
411 config.queue_length_packets = 30;
412 config.queue_delay_ms = 100;
413 auto fixture = CreateTestFixture(
414 "pc_foreman_cif_link_150kbps_delay100ms_30pkts_queue_overshoot30",
415 CreateTwoNetworkLinks(network_emulation_manager.get(), config),
416 [](PeerConfigurer* alice) {
417 VideoConfig video(352, 288, 30);
Artem Titov137f6c82019-05-17 10:51:15 +0200418 video.stream_label = "alice-video";
Andrey Logvinc0644672020-05-05 10:33:01 +0000419 auto frame_generator = CreateFromYuvFileFrameGenerator(
420 video, ClipNameToClipPath("foreman_cif"));
421 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov137f6c82019-05-17 10:51:15 +0200422 },
423 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100424 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +0100425 run_params.video_codecs = {VideoCodecConfig(cricket::kVp8CodecName)};
Artem Titov137f6c82019-05-17 10:51:15 +0200426 run_params.use_flex_fec = false;
427 run_params.use_ulp_fec = false;
428 run_params.video_encoder_bitrate_multiplier = 1.30;
429 fixture->Run(std::move(run_params));
430}
431
432// Weak 3G-style link: 250kbps, 1% loss, 100ms delay, 15 packets queue.
433// Packet rate and loss are low enough that loss will happen with ~3s interval.
434// This triggers protection overhead to toggle between zero and non-zero.
435// Link queue is restrictive enough to trigger loss on probes.
436TEST(PCFullStackTest, ForemanCifMediaCapacitySmallLossAndQueue) {
437 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
438 CreateNetworkEmulationManager();
439 BuiltInNetworkBehaviorConfig config;
440 config.link_capacity_kbps = 250;
441 config.queue_length_packets = 10;
442 config.queue_delay_ms = 100;
443 config.loss_percent = 1;
444 auto fixture = CreateTestFixture(
445 "pc_foreman_cif_link_250kbps_delay100ms_10pkts_loss1",
446 CreateTwoNetworkLinks(network_emulation_manager.get(), config),
447 [](PeerConfigurer* alice) {
448 VideoConfig video(352, 288, 30);
Artem Titov137f6c82019-05-17 10:51:15 +0200449 video.stream_label = "alice-video";
Andrey Logvinc0644672020-05-05 10:33:01 +0000450 auto frame_generator = CreateFromYuvFileFrameGenerator(
451 video, ClipNameToClipPath("foreman_cif"));
452 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov137f6c82019-05-17 10:51:15 +0200453 },
454 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100455 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +0100456 run_params.video_codecs = {VideoCodecConfig(cricket::kVp8CodecName)};
Artem Titov137f6c82019-05-17 10:51:15 +0200457 run_params.use_flex_fec = false;
458 run_params.use_ulp_fec = false;
459 run_params.video_encoder_bitrate_multiplier = 1.30;
460 fixture->Run(std::move(run_params));
461}
462
Danil Chapovalov636865e2020-06-03 14:11:26 +0200463TEST(PCGenericDescriptorTest, ForemanCifPlr5) {
Artem Titov137f6c82019-05-17 10:51:15 +0200464 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
465 CreateNetworkEmulationManager();
466 BuiltInNetworkBehaviorConfig config;
467 config.loss_percent = 5;
468 config.queue_delay_ms = 50;
469 auto fixture = CreateTestFixture(
Danil Chapovalov636865e2020-06-03 14:11:26 +0200470 "pc_foreman_cif_delay_50_0_plr_5_generic_descriptor",
Artem Titov137f6c82019-05-17 10:51:15 +0200471 CreateTwoNetworkLinks(network_emulation_manager.get(), config),
472 [](PeerConfigurer* alice) {
473 VideoConfig video(352, 288, 30);
Artem Titov137f6c82019-05-17 10:51:15 +0200474 video.stream_label = "alice-video";
Andrey Logvinc0644672020-05-05 10:33:01 +0000475 auto frame_generator = CreateFromYuvFileFrameGenerator(
476 video, ClipNameToClipPath("foreman_cif"));
477 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov137f6c82019-05-17 10:51:15 +0200478 },
479 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100480 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +0100481 run_params.video_codecs = {VideoCodecConfig(cricket::kVp8CodecName)};
Artem Titov137f6c82019-05-17 10:51:15 +0200482 run_params.use_flex_fec = false;
483 run_params.use_ulp_fec = false;
484 fixture->Run(std::move(run_params));
485}
486
Danil Chapovalov636865e2020-06-03 14:11:26 +0200487TEST(PCGenericDescriptorTest, ForemanCifPlr5Ulpfec) {
Artem Titov137f6c82019-05-17 10:51:15 +0200488 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
489 CreateNetworkEmulationManager();
490 BuiltInNetworkBehaviorConfig config;
491 config.loss_percent = 5;
492 config.queue_delay_ms = 50;
493 auto fixture = CreateTestFixture(
Danil Chapovalov636865e2020-06-03 14:11:26 +0200494 "pc_foreman_cif_delay_50_0_plr_5_ulpfec_generic_descriptor",
Artem Titov137f6c82019-05-17 10:51:15 +0200495 CreateTwoNetworkLinks(network_emulation_manager.get(), config),
496 [](PeerConfigurer* alice) {
497 VideoConfig video(352, 288, 30);
Artem Titov137f6c82019-05-17 10:51:15 +0200498 video.stream_label = "alice-video";
Andrey Logvinc0644672020-05-05 10:33:01 +0000499 auto frame_generator = CreateFromYuvFileFrameGenerator(
500 video, ClipNameToClipPath("foreman_cif"));
501 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov137f6c82019-05-17 10:51:15 +0200502 },
503 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100504 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +0100505 run_params.video_codecs = {VideoCodecConfig(cricket::kVp8CodecName)};
Artem Titov137f6c82019-05-17 10:51:15 +0200506 run_params.use_flex_fec = false;
507 run_params.use_ulp_fec = true;
508 fixture->Run(std::move(run_params));
509}
510
511TEST(PCFullStackTest, ForemanCifPlr5Flexfec) {
512 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
513 CreateNetworkEmulationManager();
514 BuiltInNetworkBehaviorConfig config;
515 config.loss_percent = 5;
516 config.queue_delay_ms = 50;
517 auto fixture = CreateTestFixture(
518 "pc_foreman_cif_delay_50_0_plr_5_flexfec",
519 CreateTwoNetworkLinks(network_emulation_manager.get(), config),
520 [](PeerConfigurer* alice) {
521 VideoConfig video(352, 288, 30);
Artem Titov137f6c82019-05-17 10:51:15 +0200522 video.stream_label = "alice-video";
Andrey Logvinc0644672020-05-05 10:33:01 +0000523 auto frame_generator = CreateFromYuvFileFrameGenerator(
524 video, ClipNameToClipPath("foreman_cif"));
525 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov137f6c82019-05-17 10:51:15 +0200526 },
527 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100528 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +0100529 run_params.video_codecs = {VideoCodecConfig(cricket::kVp8CodecName)};
Artem Titov137f6c82019-05-17 10:51:15 +0200530 run_params.use_flex_fec = true;
531 run_params.use_ulp_fec = false;
532 fixture->Run(std::move(run_params));
533}
534
535TEST(PCFullStackTest, ForemanCif500kbpsPlr3Flexfec) {
536 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
537 CreateNetworkEmulationManager();
538 BuiltInNetworkBehaviorConfig config;
539 config.loss_percent = 3;
540 config.link_capacity_kbps = 500;
541 config.queue_delay_ms = 50;
542 auto fixture = CreateTestFixture(
543 "pc_foreman_cif_500kbps_delay_50_0_plr_3_flexfec",
544 CreateTwoNetworkLinks(network_emulation_manager.get(), config),
545 [](PeerConfigurer* alice) {
546 VideoConfig video(352, 288, 30);
Artem Titov137f6c82019-05-17 10:51:15 +0200547 video.stream_label = "alice-video";
Andrey Logvinc0644672020-05-05 10:33:01 +0000548 auto frame_generator = CreateFromYuvFileFrameGenerator(
549 video, ClipNameToClipPath("foreman_cif"));
550 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov137f6c82019-05-17 10:51:15 +0200551 },
552 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100553 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +0100554 run_params.video_codecs = {VideoCodecConfig(cricket::kVp8CodecName)};
Artem Titov137f6c82019-05-17 10:51:15 +0200555 run_params.use_flex_fec = true;
556 run_params.use_ulp_fec = false;
557 fixture->Run(std::move(run_params));
558}
559
560TEST(PCFullStackTest, ForemanCif500kbpsPlr3Ulpfec) {
561 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
562 CreateNetworkEmulationManager();
563 BuiltInNetworkBehaviorConfig config;
564 config.loss_percent = 3;
565 config.link_capacity_kbps = 500;
566 config.queue_delay_ms = 50;
567 auto fixture = CreateTestFixture(
568 "pc_foreman_cif_500kbps_delay_50_0_plr_3_ulpfec",
569 CreateTwoNetworkLinks(network_emulation_manager.get(), config),
570 [](PeerConfigurer* alice) {
571 VideoConfig video(352, 288, 30);
Artem Titov137f6c82019-05-17 10:51:15 +0200572 video.stream_label = "alice-video";
Andrey Logvinc0644672020-05-05 10:33:01 +0000573 auto frame_generator = CreateFromYuvFileFrameGenerator(
574 video, ClipNameToClipPath("foreman_cif"));
575 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov137f6c82019-05-17 10:51:15 +0200576 },
577 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100578 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +0100579 run_params.video_codecs = {VideoCodecConfig(cricket::kVp8CodecName)};
Artem Titov137f6c82019-05-17 10:51:15 +0200580 run_params.use_flex_fec = false;
581 run_params.use_ulp_fec = true;
582 fixture->Run(std::move(run_params));
583}
584
585#if defined(WEBRTC_USE_H264)
586TEST(PCFullStackTest, ForemanCifWithoutPacketlossH264) {
587 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
588 CreateNetworkEmulationManager();
589 auto fixture = CreateTestFixture(
590 "pc_foreman_cif_net_delay_0_0_plr_0_H264",
591 CreateTwoNetworkLinks(network_emulation_manager.get(),
592 BuiltInNetworkBehaviorConfig()),
593 [](PeerConfigurer* alice) {
594 VideoConfig video(352, 288, 30);
Artem Titov137f6c82019-05-17 10:51:15 +0200595 video.stream_label = "alice-video";
Andrey Logvinc0644672020-05-05 10:33:01 +0000596 auto frame_generator = CreateFromYuvFileFrameGenerator(
597 video, ClipNameToClipPath("foreman_cif"));
598 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov137f6c82019-05-17 10:51:15 +0200599 },
600 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100601 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +0100602 run_params.video_codecs = {VideoCodecConfig(cricket::kH264CodecName)};
Artem Titov137f6c82019-05-17 10:51:15 +0200603 run_params.use_flex_fec = false;
604 run_params.use_ulp_fec = false;
605 fixture->Run(std::move(run_params));
606}
607
Artem Titov85a9d912019-05-29 14:36:50 +0200608TEST(PCFullStackTest, ForemanCif30kbpsWithoutPacketlossH264) {
Artem Titov137f6c82019-05-17 10:51:15 +0200609 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
610 CreateNetworkEmulationManager();
611 BuiltInNetworkBehaviorConfig config;
Artem Titov137f6c82019-05-17 10:51:15 +0200612 auto fixture = CreateTestFixture(
Artem Titoved4d1582019-05-20 12:04:05 +0200613 "pc_foreman_cif_30kbps_net_delay_0_0_plr_0_H264",
Artem Titov137f6c82019-05-17 10:51:15 +0200614 CreateTwoNetworkLinks(network_emulation_manager.get(), config),
615 [](PeerConfigurer* alice) {
616 VideoConfig video(352, 288, 10);
Artem Titov137f6c82019-05-17 10:51:15 +0200617 video.stream_label = "alice-video";
Andrey Logvinc0644672020-05-05 10:33:01 +0000618 auto frame_generator = CreateFromYuvFileFrameGenerator(
619 video, ClipNameToClipPath("foreman_cif"));
620 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov85a9d912019-05-29 14:36:50 +0200621
Niels Möller29d59a12020-06-22 14:48:10 +0200622 BitrateSettings bitrate_settings;
623 bitrate_settings.min_bitrate_bps = 30000;
624 bitrate_settings.start_bitrate_bps = 30000;
625 bitrate_settings.max_bitrate_bps = 30000;
626 alice->SetBitrateSettings(bitrate_settings);
Artem Titov137f6c82019-05-17 10:51:15 +0200627 },
628 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100629 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +0100630 run_params.video_codecs = {VideoCodecConfig(cricket::kH264CodecName)};
Artem Titov137f6c82019-05-17 10:51:15 +0200631 run_params.use_flex_fec = false;
632 run_params.use_ulp_fec = false;
633 fixture->Run(std::move(run_params));
634}
635
Danil Chapovalov636865e2020-06-03 14:11:26 +0200636TEST(PCGenericDescriptorTest, ForemanCifPlr5H264) {
Artem Titov137f6c82019-05-17 10:51:15 +0200637 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
638 CreateNetworkEmulationManager();
639 BuiltInNetworkBehaviorConfig config;
640 config.loss_percent = 5;
641 config.queue_delay_ms = 50;
642 auto fixture = CreateTestFixture(
Danil Chapovalov636865e2020-06-03 14:11:26 +0200643 "pc_foreman_cif_delay_50_0_plr_5_H264_generic_descriptor",
Artem Titov137f6c82019-05-17 10:51:15 +0200644 CreateTwoNetworkLinks(network_emulation_manager.get(), config),
645 [](PeerConfigurer* alice) {
646 VideoConfig video(352, 288, 30);
Artem Titov137f6c82019-05-17 10:51:15 +0200647 video.stream_label = "alice-video";
Andrey Logvinc0644672020-05-05 10:33:01 +0000648 auto frame_generator = CreateFromYuvFileFrameGenerator(
649 video, ClipNameToClipPath("foreman_cif"));
650 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov137f6c82019-05-17 10:51:15 +0200651 },
652 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100653 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +0100654 run_params.video_codecs = {VideoCodecConfig(cricket::kH264CodecName)};
Artem Titov137f6c82019-05-17 10:51:15 +0200655 run_params.use_flex_fec = false;
656 run_params.use_ulp_fec = false;
657 fixture->Run(std::move(run_params));
658}
659
660TEST(PCFullStackTest, ForemanCifPlr5H264SpsPpsIdrIsKeyframe) {
661 test::ScopedFieldTrials override_field_trials(
662 AppendFieldTrials("WebRTC-SpsPpsIdrIsH264Keyframe/Enabled/"));
663
664 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
665 CreateNetworkEmulationManager();
666 BuiltInNetworkBehaviorConfig config;
667 config.loss_percent = 5;
668 config.queue_delay_ms = 50;
669 auto fixture = CreateTestFixture(
670 "pc_foreman_cif_delay_50_0_plr_5_H264_sps_pps_idr",
671 CreateTwoNetworkLinks(network_emulation_manager.get(), config),
672 [](PeerConfigurer* alice) {
673 VideoConfig video(352, 288, 30);
Artem Titov137f6c82019-05-17 10:51:15 +0200674 video.stream_label = "alice-video";
Andrey Logvinc0644672020-05-05 10:33:01 +0000675 auto frame_generator = CreateFromYuvFileFrameGenerator(
676 video, ClipNameToClipPath("foreman_cif"));
677 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov137f6c82019-05-17 10:51:15 +0200678 },
679 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100680 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +0100681 run_params.video_codecs = {VideoCodecConfig(cricket::kH264CodecName)};
Artem Titov137f6c82019-05-17 10:51:15 +0200682 run_params.use_flex_fec = false;
683 run_params.use_ulp_fec = false;
684 fixture->Run(std::move(run_params));
685}
686
687TEST(PCFullStackTest, ForemanCifPlr5H264Flexfec) {
688 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
689 CreateNetworkEmulationManager();
690 BuiltInNetworkBehaviorConfig config;
691 config.loss_percent = 5;
692 config.queue_delay_ms = 50;
693 auto fixture = CreateTestFixture(
694 "pc_foreman_cif_delay_50_0_plr_5_H264_flexfec",
695 CreateTwoNetworkLinks(network_emulation_manager.get(), config),
696 [](PeerConfigurer* alice) {
697 VideoConfig video(352, 288, 30);
Artem Titov137f6c82019-05-17 10:51:15 +0200698 video.stream_label = "alice-video";
Andrey Logvinc0644672020-05-05 10:33:01 +0000699 auto frame_generator = CreateFromYuvFileFrameGenerator(
700 video, ClipNameToClipPath("foreman_cif"));
701 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov137f6c82019-05-17 10:51:15 +0200702 },
703 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100704 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +0100705 run_params.video_codecs = {VideoCodecConfig(cricket::kH264CodecName)};
Artem Titov137f6c82019-05-17 10:51:15 +0200706 run_params.use_flex_fec = true;
707 run_params.use_ulp_fec = false;
708 fixture->Run(std::move(run_params));
709}
710
711// Ulpfec with H264 is an unsupported combination, so this test is only useful
712// for debugging. It is therefore disabled by default.
713TEST(PCFullStackTest, DISABLED_ForemanCifPlr5H264Ulpfec) {
714 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
715 CreateNetworkEmulationManager();
716 BuiltInNetworkBehaviorConfig config;
717 config.loss_percent = 5;
718 config.queue_delay_ms = 50;
719 auto fixture = CreateTestFixture(
Artem Titoved4d1582019-05-20 12:04:05 +0200720 "pc_foreman_cif_delay_50_0_plr_5_H264_ulpfec",
Artem Titov137f6c82019-05-17 10:51:15 +0200721 CreateTwoNetworkLinks(network_emulation_manager.get(), config),
722 [](PeerConfigurer* alice) {
723 VideoConfig video(352, 288, 30);
Artem Titov137f6c82019-05-17 10:51:15 +0200724 video.stream_label = "alice-video";
Andrey Logvinc0644672020-05-05 10:33:01 +0000725 auto frame_generator = CreateFromYuvFileFrameGenerator(
726 video, ClipNameToClipPath("foreman_cif"));
727 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov137f6c82019-05-17 10:51:15 +0200728 },
729 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100730 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +0100731 run_params.video_codecs = {VideoCodecConfig(cricket::kH264CodecName)};
Artem Titov137f6c82019-05-17 10:51:15 +0200732 run_params.use_flex_fec = false;
733 run_params.use_ulp_fec = true;
734 fixture->Run(std::move(run_params));
735}
736#endif // defined(WEBRTC_USE_H264)
737
738TEST(PCFullStackTest, ForemanCif500kbps) {
739 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
740 CreateNetworkEmulationManager();
741 BuiltInNetworkBehaviorConfig config;
742 config.queue_length_packets = 0;
743 config.queue_delay_ms = 0;
744 config.link_capacity_kbps = 500;
745 auto fixture = CreateTestFixture(
746 "pc_foreman_cif_500kbps",
747 CreateTwoNetworkLinks(network_emulation_manager.get(), config),
748 [](PeerConfigurer* alice) {
749 VideoConfig video(352, 288, 30);
Artem Titov137f6c82019-05-17 10:51:15 +0200750 video.stream_label = "alice-video";
Andrey Logvinc0644672020-05-05 10:33:01 +0000751 auto frame_generator = CreateFromYuvFileFrameGenerator(
752 video, ClipNameToClipPath("foreman_cif"));
753 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov137f6c82019-05-17 10:51:15 +0200754 },
755 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100756 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +0100757 run_params.video_codecs = {VideoCodecConfig(cricket::kVp8CodecName)};
Artem Titov137f6c82019-05-17 10:51:15 +0200758 run_params.use_flex_fec = false;
759 run_params.use_ulp_fec = false;
760 fixture->Run(std::move(run_params));
761}
762
763TEST(PCFullStackTest, ForemanCif500kbpsLimitedQueue) {
764 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
765 CreateNetworkEmulationManager();
766 BuiltInNetworkBehaviorConfig config;
767 config.queue_length_packets = 32;
768 config.queue_delay_ms = 0;
769 config.link_capacity_kbps = 500;
770 auto fixture = CreateTestFixture(
771 "pc_foreman_cif_500kbps_32pkts_queue",
772 CreateTwoNetworkLinks(network_emulation_manager.get(), config),
773 [](PeerConfigurer* alice) {
774 VideoConfig video(352, 288, 30);
Artem Titov137f6c82019-05-17 10:51:15 +0200775 video.stream_label = "alice-video";
Andrey Logvinc0644672020-05-05 10:33:01 +0000776 auto frame_generator = CreateFromYuvFileFrameGenerator(
777 video, ClipNameToClipPath("foreman_cif"));
778 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov137f6c82019-05-17 10:51:15 +0200779 },
780 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100781 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +0100782 run_params.video_codecs = {VideoCodecConfig(cricket::kVp8CodecName)};
Artem Titov137f6c82019-05-17 10:51:15 +0200783 run_params.use_flex_fec = false;
784 run_params.use_ulp_fec = false;
785 fixture->Run(std::move(run_params));
786}
787
788TEST(PCFullStackTest, ForemanCif500kbps100ms) {
789 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
790 CreateNetworkEmulationManager();
791 BuiltInNetworkBehaviorConfig config;
792 config.queue_length_packets = 0;
793 config.queue_delay_ms = 100;
794 config.link_capacity_kbps = 500;
795 auto fixture = CreateTestFixture(
796 "pc_foreman_cif_500kbps_100ms",
797 CreateTwoNetworkLinks(network_emulation_manager.get(), config),
798 [](PeerConfigurer* alice) {
799 VideoConfig video(352, 288, 30);
Artem Titov137f6c82019-05-17 10:51:15 +0200800 video.stream_label = "alice-video";
Andrey Logvinc0644672020-05-05 10:33:01 +0000801 auto frame_generator = CreateFromYuvFileFrameGenerator(
802 video, ClipNameToClipPath("foreman_cif"));
803 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov137f6c82019-05-17 10:51:15 +0200804 },
805 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100806 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +0100807 run_params.video_codecs = {VideoCodecConfig(cricket::kVp8CodecName)};
Artem Titov137f6c82019-05-17 10:51:15 +0200808 run_params.use_flex_fec = false;
809 run_params.use_ulp_fec = false;
810 fixture->Run(std::move(run_params));
811}
812
Danil Chapovalov636865e2020-06-03 14:11:26 +0200813TEST(PCGenericDescriptorTest, ForemanCif500kbps100msLimitedQueue) {
Artem Titov137f6c82019-05-17 10:51:15 +0200814 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
815 CreateNetworkEmulationManager();
816 BuiltInNetworkBehaviorConfig config;
817 config.queue_length_packets = 32;
818 config.queue_delay_ms = 100;
819 config.link_capacity_kbps = 500;
820 auto fixture = CreateTestFixture(
Danil Chapovalov636865e2020-06-03 14:11:26 +0200821 "pc_foreman_cif_500kbps_100ms_32pkts_queue_generic_descriptor",
Artem Titov137f6c82019-05-17 10:51:15 +0200822 CreateTwoNetworkLinks(network_emulation_manager.get(), config),
823 [](PeerConfigurer* alice) {
824 VideoConfig video(352, 288, 30);
Artem Titov137f6c82019-05-17 10:51:15 +0200825 video.stream_label = "alice-video";
Andrey Logvinc0644672020-05-05 10:33:01 +0000826 auto frame_generator = CreateFromYuvFileFrameGenerator(
827 video, ClipNameToClipPath("foreman_cif"));
828 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov137f6c82019-05-17 10:51:15 +0200829 },
830 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100831 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +0100832 run_params.video_codecs = {VideoCodecConfig(cricket::kVp8CodecName)};
Artem Titov137f6c82019-05-17 10:51:15 +0200833 run_params.use_flex_fec = false;
834 run_params.use_ulp_fec = false;
835 fixture->Run(std::move(run_params));
836}
837
838/*
839// TODO(bugs.webrtc.org/10639) we need to disable send side bwe, but it isn't
Artem Titov39483c62019-07-19 17:03:52 +0200840// supported in PC level framework.
Artem Titov137f6c82019-05-17 10:51:15 +0200841TEST(PCFullStackTest, ForemanCif500kbps100msLimitedQueueRecvBwe) {
842 auto fixture = CreateVideoQualityTestFixture();
843 ParamsWithLogging foreman_cif;
844 foreman_cif.call.send_side_bwe = false;
845 foreman_cif.video[0] = {
846 true, 352, 288, 30,
847 30000, 500000, 2000000, false,
848 "VP8", 1, 0, 0,
849 false, false, true, ClipNameToClipPath("foreman_cif")};
850 foreman_cif.analyzer = {"foreman_cif_500kbps_100ms_32pkts_queue_recv_bwe",
851 0.0, 0.0, kTestDurationSec};
852 foreman_cif.config->queue_length_packets = 32;
853 foreman_cif.config->queue_delay_ms = 100;
854 foreman_cif.config->link_capacity_kbps = 500;
855 fixture->RunWithAnalyzer(foreman_cif);
856}
857*/
858
859TEST(PCFullStackTest, ForemanCif1000kbps100msLimitedQueue) {
860 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
861 CreateNetworkEmulationManager();
862 BuiltInNetworkBehaviorConfig config;
863 config.queue_length_packets = 32;
864 config.queue_delay_ms = 100;
865 config.link_capacity_kbps = 1000;
866 auto fixture = CreateTestFixture(
867 "pc_foreman_cif_1000kbps_100ms_32pkts_queue",
868 CreateTwoNetworkLinks(network_emulation_manager.get(), config),
869 [](PeerConfigurer* alice) {
870 VideoConfig video(352, 288, 30);
Artem Titov137f6c82019-05-17 10:51:15 +0200871 video.stream_label = "alice-video";
Andrey Logvinc0644672020-05-05 10:33:01 +0000872 auto frame_generator = CreateFromYuvFileFrameGenerator(
873 video, ClipNameToClipPath("foreman_cif"));
874 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov137f6c82019-05-17 10:51:15 +0200875 },
876 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100877 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +0100878 run_params.video_codecs = {VideoCodecConfig(cricket::kVp8CodecName)};
Artem Titov137f6c82019-05-17 10:51:15 +0200879 run_params.use_flex_fec = false;
880 run_params.use_ulp_fec = false;
881 fixture->Run(std::move(run_params));
882}
883
884// TODO(sprang): Remove this if we have the similar ModerateLimits below?
885TEST(PCFullStackTest, ConferenceMotionHd2000kbps100msLimitedQueue) {
886 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
887 CreateNetworkEmulationManager();
888 BuiltInNetworkBehaviorConfig config;
889 config.queue_length_packets = 32;
890 config.queue_delay_ms = 100;
891 config.link_capacity_kbps = 2000;
892 auto fixture = CreateTestFixture(
893 "pc_conference_motion_hd_2000kbps_100ms_32pkts_queue",
894 CreateTwoNetworkLinks(network_emulation_manager.get(), config),
895 [](PeerConfigurer* alice) {
896 VideoConfig video(1280, 720, 50);
Artem Titov137f6c82019-05-17 10:51:15 +0200897 video.stream_label = "alice-video";
Andrey Logvinc0644672020-05-05 10:33:01 +0000898 auto frame_generator = CreateFromYuvFileFrameGenerator(
899 video, ClipNameToClipPath("ConferenceMotion_1280_720_50"));
900 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov137f6c82019-05-17 10:51:15 +0200901 },
902 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100903 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +0100904 run_params.video_codecs = {VideoCodecConfig(cricket::kVp8CodecName)};
Artem Titov137f6c82019-05-17 10:51:15 +0200905 run_params.use_flex_fec = false;
906 run_params.use_ulp_fec = false;
907 fixture->Run(std::move(run_params));
908}
909
910// TODO(webrtc:9722): Remove when experiment is cleaned up.
911TEST(PCFullStackTest, ConferenceMotionHd1TLModerateLimitsWhitelistVp8) {
912 test::ScopedFieldTrials override_field_trials(
913 AppendFieldTrials(kVp8TrustedRateControllerFieldTrial));
914 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
915 CreateNetworkEmulationManager();
916 BuiltInNetworkBehaviorConfig config;
917 config.queue_length_packets = 50;
918 config.loss_percent = 3;
919 config.queue_delay_ms = 100;
920 config.link_capacity_kbps = 2000;
921 auto fixture = CreateTestFixture(
922 "pc_conference_motion_hd_1tl_moderate_limits_trusted_rate_ctrl",
923 CreateTwoNetworkLinks(network_emulation_manager.get(), config),
924 [](PeerConfigurer* alice) {
925 VideoConfig video(1280, 720, 50);
Artem Titov137f6c82019-05-17 10:51:15 +0200926 video.stream_label = "alice-video";
Andrey Logvinc0644672020-05-05 10:33:01 +0000927 auto frame_generator = CreateFromYuvFileFrameGenerator(
928 video, ClipNameToClipPath("ConferenceMotion_1280_720_50"));
929 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov137f6c82019-05-17 10:51:15 +0200930 },
931 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100932 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +0100933 run_params.video_codecs = {VideoCodecConfig(cricket::kVp8CodecName)};
Artem Titov137f6c82019-05-17 10:51:15 +0200934 run_params.use_flex_fec = false;
935 run_params.use_ulp_fec = false;
936 fixture->Run(std::move(run_params));
937}
938
939/*
940// TODO(bugs.webrtc.org/10639) requires simulcast/SVC support in PC framework
Danil Chapovalov636865e2020-06-03 14:11:26 +0200941TEST(PCGenericDescriptorTest, ConferenceMotionHd2TLModerateLimits) {
Artem Titov137f6c82019-05-17 10:51:15 +0200942 auto fixture = CreateVideoQualityTestFixture();
943 ParamsWithLogging conf_motion_hd;
944 conf_motion_hd.call.send_side_bwe = true;
945 conf_motion_hd.video[0] = {
946 true, 1280,
947 720, 50,
948 30000, 3000000,
949 3000000, false,
950 "VP8", 2,
951 -1, 0,
952 false, false,
953 false, ClipNameToClipPath("ConferenceMotion_1280_720_50")};
954 conf_motion_hd.analyzer = {
Danil Chapovalov636865e2020-06-03 14:11:26 +0200955 "conference_motion_hd_2tl_moderate_limits_generic_descriptor", 0.0, 0.0,
Artem Titov137f6c82019-05-17 10:51:15 +0200956 kTestDurationSec};
957 conf_motion_hd.config->queue_length_packets = 50;
958 conf_motion_hd.config->loss_percent = 3;
959 conf_motion_hd.config->queue_delay_ms = 100;
960 conf_motion_hd.config->link_capacity_kbps = 2000;
961 conf_motion_hd.call.generic_descriptor = GenericDescriptorEnabled();
962 fixture->RunWithAnalyzer(conf_motion_hd);
963}
964
965// TODO(bugs.webrtc.org/10639) requires simulcast/SVC support in PC framework
966TEST(PCFullStackTest, ConferenceMotionHd3TLModerateLimits) {
967 auto fixture = CreateVideoQualityTestFixture();
968 ParamsWithLogging conf_motion_hd;
969 conf_motion_hd.call.send_side_bwe = true;
970 conf_motion_hd.video[0] = {
971 true, 1280,
972 720, 50,
973 30000, 3000000,
974 3000000, false,
975 "VP8", 3,
976 -1, 0,
977 false, false,
978 false, ClipNameToClipPath("ConferenceMotion_1280_720_50")};
979 conf_motion_hd.analyzer = {"conference_motion_hd_3tl_moderate_limits", 0.0,
980 0.0, kTestDurationSec};
981 conf_motion_hd.config->queue_length_packets = 50;
982 conf_motion_hd.config->loss_percent = 3;
983 conf_motion_hd.config->queue_delay_ms = 100;
984 conf_motion_hd.config->link_capacity_kbps = 2000;
985 fixture->RunWithAnalyzer(conf_motion_hd);
986}
987
988// TODO(bugs.webrtc.org/10639) requires simulcast/SVC support in PC framework
989TEST(PCFullStackTest, ConferenceMotionHd4TLModerateLimits) {
990 auto fixture = CreateVideoQualityTestFixture();
991 ParamsWithLogging conf_motion_hd;
992 conf_motion_hd.call.send_side_bwe = true;
993 conf_motion_hd.video[0] = {
994 true, 1280,
995 720, 50,
996 30000, 3000000,
997 3000000, false,
998 "VP8", 4,
999 -1, 0,
1000 false, false,
1001 false, ClipNameToClipPath("ConferenceMotion_1280_720_50")};
1002 conf_motion_hd.analyzer = {"conference_motion_hd_4tl_moderate_limits", 0.0,
1003 0.0, kTestDurationSec};
1004 conf_motion_hd.config->queue_length_packets = 50;
1005 conf_motion_hd.config->loss_percent = 3;
1006 conf_motion_hd.config->queue_delay_ms = 100;
1007 conf_motion_hd.config->link_capacity_kbps = 2000;
1008 fixture->RunWithAnalyzer(conf_motion_hd);
1009}
1010
1011// TODO(bugs.webrtc.org/10639) requires simulcast/SVC support in PC framework
1012TEST(PCFullStackTest, ConferenceMotionHd3TLModerateLimitsAltTLPattern) {
1013 test::ScopedFieldTrials field_trial(
1014 AppendFieldTrials("WebRTC-UseShortVP8TL3Pattern/Enabled/"));
1015 auto fixture = CreateVideoQualityTestFixture();
1016 ParamsWithLogging conf_motion_hd;
1017 conf_motion_hd.call.send_side_bwe = true;
1018 conf_motion_hd.video[0] = {
1019 true, 1280,
1020 720, 50,
1021 30000, 3000000,
1022 3000000, false,
1023 "VP8", 3,
1024 -1, 0,
1025 false, false,
1026 false, ClipNameToClipPath("ConferenceMotion_1280_720_50")};
1027 conf_motion_hd.analyzer = {"conference_motion_hd_3tl_alt_moderate_limits",
1028 0.0, 0.0, kTestDurationSec};
1029 conf_motion_hd.config->queue_length_packets = 50;
1030 conf_motion_hd.config->loss_percent = 3;
1031 conf_motion_hd.config->queue_delay_ms = 100;
1032 conf_motion_hd.config->link_capacity_kbps = 2000;
1033 fixture->RunWithAnalyzer(conf_motion_hd);
1034}
1035
1036// TODO(bugs.webrtc.org/10639) requires simulcast/SVC support in PC framework
1037TEST(PCFullStackTest,
1038 ConferenceMotionHd3TLModerateLimitsAltTLPatternAndBaseHeavyTLAllocation) {
1039 auto fixture = CreateVideoQualityTestFixture();
1040 test::ScopedFieldTrials field_trial(
1041 AppendFieldTrials("WebRTC-UseShortVP8TL3Pattern/Enabled/"
1042 "WebRTC-UseBaseHeavyVP8TL3RateAllocation/Enabled/"));
1043 ParamsWithLogging conf_motion_hd;
1044 conf_motion_hd.call.send_side_bwe = true;
1045 conf_motion_hd.video[0] = {
1046 true, 1280,
1047 720, 50,
1048 30000, 3000000,
1049 3000000, false,
1050 "VP8", 3,
1051 -1, 0,
1052 false, false,
1053 false, ClipNameToClipPath("ConferenceMotion_1280_720_50")};
1054 conf_motion_hd.analyzer = {
1055 "conference_motion_hd_3tl_alt_heavy_moderate_limits", 0.0, 0.0,
1056 kTestDurationSec};
1057 conf_motion_hd.config->queue_length_packets = 50;
1058 conf_motion_hd.config->loss_percent = 3;
1059 conf_motion_hd.config->queue_delay_ms = 100;
1060 conf_motion_hd.config->link_capacity_kbps = 2000;
1061 fixture->RunWithAnalyzer(conf_motion_hd);
1062}
1063*/
1064
1065#if defined(RTC_ENABLE_VP9)
1066TEST(PCFullStackTest, ConferenceMotionHd2000kbps100msLimitedQueueVP9) {
1067 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
1068 CreateNetworkEmulationManager();
1069 BuiltInNetworkBehaviorConfig config;
1070 config.queue_length_packets = 32;
1071 config.queue_delay_ms = 100;
1072 config.link_capacity_kbps = 2000;
1073 auto fixture = CreateTestFixture(
1074 "pc_conference_motion_hd_2000kbps_100ms_32pkts_queue_vp9",
1075 CreateTwoNetworkLinks(network_emulation_manager.get(), config),
1076 [](PeerConfigurer* alice) {
1077 VideoConfig video(1280, 720, 50);
Artem Titov137f6c82019-05-17 10:51:15 +02001078 video.stream_label = "alice-video";
Andrey Logvinc0644672020-05-05 10:33:01 +00001079 auto frame_generator = CreateFromYuvFileFrameGenerator(
1080 video, ClipNameToClipPath("ConferenceMotion_1280_720_50"));
1081 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov137f6c82019-05-17 10:51:15 +02001082 },
1083 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +01001084 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +01001085 run_params.video_codecs = {VideoCodecConfig(
1086 /*name=*/cricket::kVp9CodecName, /*required_params=*/{
1087 {kVP9FmtpProfileId, VP9ProfileToString(VP9Profile::kProfile0)}})};
Artem Titov137f6c82019-05-17 10:51:15 +02001088 run_params.use_flex_fec = false;
1089 run_params.use_ulp_fec = false;
1090 fixture->Run(std::move(run_params));
1091}
1092#endif
1093
Artem Titov39483c62019-07-19 17:03:52 +02001094TEST(PCFullStackTest, ScreenshareSlidesVP8_2TL_NoConferenceMode) {
1095 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
1096 CreateNetworkEmulationManager();
1097 auto fixture = CreateTestFixture(
1098 "pc_screenshare_slides_no_conference_mode",
1099 CreateTwoNetworkLinks(network_emulation_manager.get(),
1100 BuiltInNetworkBehaviorConfig()),
1101 [](PeerConfigurer* alice) {
1102 VideoConfig video(1850, 1110, 5);
Artem Titov39483c62019-07-19 17:03:52 +02001103 video.stream_label = "alice-video";
Andrey Logvin435fb9a2020-05-08 08:02:49 +00001104 video.content_hint = VideoTrackInterface::ContentHint::kText;
1105 auto frame_generator = CreateScreenShareFrameGenerator(
1106 video, ScreenShareConfig(TimeDelta::Seconds(10)));
Andrey Logvinc0644672020-05-05 10:33:01 +00001107 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov39483c62019-07-19 17:03:52 +02001108 },
1109 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +01001110 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +01001111 run_params.video_codecs = {VideoCodecConfig(cricket::kVp8CodecName)};
Artem Titov39483c62019-07-19 17:03:52 +02001112 run_params.use_flex_fec = false;
1113 run_params.use_ulp_fec = false;
1114 fixture->Run(std::move(run_params));
Artem Titov137f6c82019-05-17 10:51:15 +02001115}
1116
Artem Titov39483c62019-07-19 17:03:52 +02001117TEST(PCFullStackTest, ScreenshareSlidesVP8_2TL) {
1118 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
1119 CreateNetworkEmulationManager();
1120 auto fixture = CreateTestFixture(
1121 "pc_screenshare_slides",
1122 CreateTwoNetworkLinks(network_emulation_manager.get(),
1123 BuiltInNetworkBehaviorConfig()),
1124 [](PeerConfigurer* alice) {
1125 VideoConfig video(1850, 1110, 5);
Artem Titov39483c62019-07-19 17:03:52 +02001126 video.stream_label = "alice-video";
Andrey Logvin435fb9a2020-05-08 08:02:49 +00001127 video.content_hint = VideoTrackInterface::ContentHint::kText;
1128 auto frame_generator = CreateScreenShareFrameGenerator(
1129 video, ScreenShareConfig(TimeDelta::Seconds(10)));
Andrey Logvinc0644672020-05-05 10:33:01 +00001130 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov39483c62019-07-19 17:03:52 +02001131 },
1132 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +01001133 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +01001134 run_params.video_codecs = {VideoCodecConfig(cricket::kVp8CodecName)};
Artem Titov39483c62019-07-19 17:03:52 +02001135 run_params.use_flex_fec = false;
1136 run_params.use_ulp_fec = false;
1137 run_params.use_conference_mode = true;
1138 fixture->Run(std::move(run_params));
1139}
1140
1141// TODO(bugs.webrtc.org/9840): Investigate why is this test flaky on Win/Mac.
1142#if !defined(WEBRTC_MAC) && !defined(WEBRTC_WIN)
1143TEST(PCFullStackTest, ScreenshareSlidesVP8_2TL_Simulcast_NoConferenceMode) {
1144 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
1145 CreateNetworkEmulationManager();
1146 auto fixture = CreateTestFixture(
1147 "pc_screenshare_slides_simulcast_no_conference_mode",
1148 CreateTwoNetworkLinks(network_emulation_manager.get(),
1149 BuiltInNetworkBehaviorConfig()),
1150 [](PeerConfigurer* alice) {
Artem Titov4b9701e2019-08-28 13:48:02 +02001151 VideoConfig video(1850, 1110, 30);
Artem Titov4b9701e2019-08-28 13:48:02 +02001152 video.simulcast_config = VideoSimulcastConfig(2, 1);
1153 video.temporal_layers_count = 2;
Artem Titov39483c62019-07-19 17:03:52 +02001154 video.stream_label = "alice-video";
Andrey Logvin435fb9a2020-05-08 08:02:49 +00001155 video.content_hint = VideoTrackInterface::ContentHint::kText;
1156 auto frame_generator = CreateScreenShareFrameGenerator(
1157 video, ScreenShareConfig(TimeDelta::Seconds(10)));
Andrey Logvinc0644672020-05-05 10:33:01 +00001158 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov39483c62019-07-19 17:03:52 +02001159 },
1160 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +01001161 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +01001162 run_params.video_codecs = {VideoCodecConfig(cricket::kVp8CodecName)};
Artem Titov39483c62019-07-19 17:03:52 +02001163 run_params.use_flex_fec = false;
1164 run_params.use_ulp_fec = false;
1165 fixture->Run(std::move(run_params));
1166}
1167
1168TEST(PCFullStackTest, ScreenshareSlidesVP8_2TL_Simulcast) {
1169 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
1170 CreateNetworkEmulationManager();
1171 auto fixture = CreateTestFixture(
1172 "pc_screenshare_slides_simulcast",
1173 CreateTwoNetworkLinks(network_emulation_manager.get(),
1174 BuiltInNetworkBehaviorConfig()),
1175 [](PeerConfigurer* alice) {
Artem Titov4b9701e2019-08-28 13:48:02 +02001176 VideoConfig video(1850, 1110, 30);
Artem Titov4b9701e2019-08-28 13:48:02 +02001177 video.simulcast_config = VideoSimulcastConfig(2, 1);
1178 video.temporal_layers_count = 2;
Artem Titov39483c62019-07-19 17:03:52 +02001179 video.stream_label = "alice-video";
Andrey Logvin435fb9a2020-05-08 08:02:49 +00001180 video.content_hint = VideoTrackInterface::ContentHint::kText;
1181 auto frame_generator = CreateScreenShareFrameGenerator(
1182 video, ScreenShareConfig(TimeDelta::Seconds(10)));
Andrey Logvinc0644672020-05-05 10:33:01 +00001183 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov39483c62019-07-19 17:03:52 +02001184 },
1185 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +01001186 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +01001187 run_params.video_codecs = {VideoCodecConfig(cricket::kVp8CodecName)};
Artem Titov39483c62019-07-19 17:03:52 +02001188 run_params.use_flex_fec = false;
1189 run_params.use_ulp_fec = false;
1190 run_params.use_conference_mode = true;
1191 fixture->Run(std::move(run_params));
1192}
1193#endif // !defined(WEBRTC_MAC) && !defined(WEBRTC_WIN)
1194
1195/*
Artem Titov137f6c82019-05-17 10:51:15 +02001196#if !defined(WEBRTC_MAC)
Artem Titov137f6c82019-05-17 10:51:15 +02001197// TODO(bugs.webrtc.org/9840): Investigate why is this test flaky on Win/Mac.
1198#if !defined(WEBRTC_WIN)
1199const char kScreenshareSimulcastVariableFramerateExperiment[] =
Artem Titov137f6c82019-05-17 10:51:15 +02001200 "WebRTC-VP8VariableFramerateScreenshare/"
1201 "Enabled,min_fps:5.0,min_qp:15,undershoot:30/";
1202// TODO(bugs.webrtc.org/10639) requires simulcast/SVC support in PC framework
Artem Titov137f6c82019-05-17 10:51:15 +02001203TEST(PCFullStackTest, ScreenshareSlidesVP8_2TL_Simulcast_Variable_Framerate) {
1204 test::ScopedFieldTrials field_trial(
1205 AppendFieldTrials(kScreenshareSimulcastVariableFramerateExperiment));
1206 auto fixture = CreateVideoQualityTestFixture();
1207 ParamsWithLogging screenshare;
1208 screenshare.call.send_side_bwe = true;
1209 screenshare.screenshare[0] = {true, false, 10};
1210 screenshare.video[0] = {true, 1850, 1110, 30, 800000, 2500000,
1211 2500000, false, "VP8", 2, 1, 400000,
1212 false, false, false, ""};
1213 screenshare.analyzer = {"screenshare_slides_simulcast_variable_framerate",
1214 0.0, 0.0, kTestDurationSec};
1215 ParamsWithLogging screenshare_params_high;
1216 screenshare_params_high.video[0] = {
1217 true, 1850, 1110, 60, 600000, 1250000, 1250000, false,
1218 "VP8", 2, 0, 400000, false, false, false, ""};
1219 VideoQualityTest::Params screenshare_params_low;
1220 screenshare_params_low.video[0] = {true, 1850, 1110, 5, 30000, 200000,
1221 1000000, false, "VP8", 2, 0, 400000,
1222 false, false, false, ""};
1223
1224 std::vector<VideoStream> streams = {
1225 VideoQualityTest::DefaultVideoStream(screenshare_params_low, 0),
1226 VideoQualityTest::DefaultVideoStream(screenshare_params_high, 0)};
1227 screenshare.ss[0] = {
1228 streams, 1, 1, 0, InterLayerPredMode::kOn, std::vector<SpatialLayer>(),
1229 false};
1230 fixture->RunWithAnalyzer(screenshare);
1231}
1232
1233// TODO(bugs.webrtc.org/10639) requires simulcast/SVC support in PC framework
1234TEST(PCFullStackTest, ScreenshareSlidesVP8_2TL_Simulcast_low) {
Artem Titov137f6c82019-05-17 10:51:15 +02001235 auto fixture = CreateVideoQualityTestFixture();
1236 ParamsWithLogging screenshare;
1237 screenshare.call.send_side_bwe = true;
1238 screenshare.screenshare[0] = {true, false, 10};
1239 screenshare.video[0] = {true, 1850, 1110, 30, 800000, 2500000,
1240 2500000, false, "VP8", 2, 1, 400000,
1241 false, false, false, ""};
1242 screenshare.analyzer = {"screenshare_slides_simulcast_low", 0.0, 0.0,
1243 kTestDurationSec};
1244 VideoQualityTest::Params screenshare_params_high;
1245 screenshare_params_high.video[0] = {
1246 true, 1850, 1110, 60, 600000, 1250000, 1250000, false,
1247 "VP8", 2, 0, 400000, false, false, false, ""};
1248 VideoQualityTest::Params screenshare_params_low;
1249 screenshare_params_low.video[0] = {true, 1850, 1110, 5, 30000, 200000,
1250 1000000, false, "VP8", 2, 0, 400000,
1251 false, false, false, ""};
1252
1253 std::vector<VideoStream> streams = {
1254 VideoQualityTest::DefaultVideoStream(screenshare_params_low, 0),
1255 VideoQualityTest::DefaultVideoStream(screenshare_params_high, 0)};
1256 screenshare.ss[0] = {
1257 streams, 0, 1, 0, InterLayerPredMode::kOn, std::vector<SpatialLayer>(),
1258 false};
1259 fixture->RunWithAnalyzer(screenshare);
1260}
1261
1262#endif // !defined(WEBRTC_WIN)
1263#endif // !defined(WEBRTC_MAC)
1264
1265// TODO(bugs.webrtc.org/10639) requires simulcast/SVC support in PC framework
1266TEST(PCFullStackTest, ScreenshareSlidesVP8_2TL_Scroll) {
1267 auto fixture = CreateVideoQualityTestFixture();
1268 ParamsWithLogging config;
1269 config.call.send_side_bwe = true;
1270 config.video[0] = {true, 1850, 1110 / 2, 5, 50000, 200000,
1271 1000000, false, "VP8", 2, 1, 400000,
1272 false, false, false, ""};
1273 config.screenshare[0] = {true, false, 10, 2};
1274 config.analyzer = {"screenshare_slides_scrolling", 0.0, 0.0,
1275 kTestDurationSec};
1276 fixture->RunWithAnalyzer(config);
1277}
1278
1279// TODO(bugs.webrtc.org/10639) requires simulcast/SVC support in PC framework
Danil Chapovalov636865e2020-06-03 14:11:26 +02001280TEST(PCGenericDescriptorTest, ScreenshareSlidesVP8_2TL_LossyNet) {
Artem Titov137f6c82019-05-17 10:51:15 +02001281 auto fixture = CreateVideoQualityTestFixture();
1282 ParamsWithLogging screenshare;
1283 screenshare.call.send_side_bwe = true;
1284 screenshare.video[0] = {true, 1850, 1110, 5, 50000, 200000,
1285 1000000, false, "VP8", 2, 1, 400000,
1286 false, false, false, ""};
1287 screenshare.screenshare[0] = {true, false, 10};
Danil Chapovalov636865e2020-06-03 14:11:26 +02001288 screenshare.analyzer = {"screenshare_slides_lossy_net_generic_descriptor",
1289 0.0, 0.0, kTestDurationSec};
Artem Titov137f6c82019-05-17 10:51:15 +02001290 screenshare.config->loss_percent = 5;
1291 screenshare.config->queue_delay_ms = 200;
1292 screenshare.config->link_capacity_kbps = 500;
Danil Chapovalov636865e2020-06-03 14:11:26 +02001293 screenshare.call.generic_descriptor = true;
Artem Titov137f6c82019-05-17 10:51:15 +02001294 fixture->RunWithAnalyzer(screenshare);
1295}
1296
1297// TODO(bugs.webrtc.org/10639) requires simulcast/SVC support in PC framework
1298TEST(PCFullStackTest, ScreenshareSlidesVP8_2TL_VeryLossyNet) {
1299 auto fixture = CreateVideoQualityTestFixture();
1300 ParamsWithLogging screenshare;
1301 screenshare.call.send_side_bwe = true;
1302 screenshare.video[0] = {true, 1850, 1110, 5, 50000, 200000,
1303 1000000, false, "VP8", 2, 1, 400000,
1304 false, false, false, ""};
1305 screenshare.screenshare[0] = {true, false, 10};
1306 screenshare.analyzer = {"screenshare_slides_very_lossy", 0.0, 0.0,
1307 kTestDurationSec};
1308 screenshare.config->loss_percent = 10;
1309 screenshare.config->queue_delay_ms = 200;
1310 screenshare.config->link_capacity_kbps = 500;
1311 fixture->RunWithAnalyzer(screenshare);
1312}
1313
1314// TODO(bugs.webrtc.org/10639) requires simulcast/SVC support in PC framework
1315TEST(PCFullStackTest, ScreenshareSlidesVP8_2TL_LossyNetRestrictedQueue) {
1316 auto fixture = CreateVideoQualityTestFixture();
1317 ParamsWithLogging screenshare;
1318 screenshare.call.send_side_bwe = true;
1319 screenshare.video[0] = {true, 1850, 1110, 5, 50000, 200000,
1320 1000000, false, "VP8", 2, 1, 400000,
1321 false, false, false, ""};
1322 screenshare.screenshare[0] = {true, false, 10};
1323 screenshare.analyzer = {"screenshare_slides_lossy_limited", 0.0, 0.0,
1324 kTestDurationSec};
1325 screenshare.config->loss_percent = 5;
1326 screenshare.config->link_capacity_kbps = 200;
1327 screenshare.config->queue_length_packets = 30;
1328
1329 fixture->RunWithAnalyzer(screenshare);
1330}
1331
1332// TODO(bugs.webrtc.org/10639) requires simulcast/SVC support in PC framework
1333TEST(PCFullStackTest, ScreenshareSlidesVP8_2TL_ModeratelyRestricted) {
1334 auto fixture = CreateVideoQualityTestFixture();
1335 ParamsWithLogging screenshare;
1336 screenshare.call.send_side_bwe = true;
1337 screenshare.video[0] = {true, 1850, 1110, 5, 50000, 200000,
1338 1000000, false, "VP8", 2, 1, 400000,
1339 false, false, false, ""};
1340 screenshare.screenshare[0] = {true, false, 10};
1341 screenshare.analyzer = {"screenshare_slides_moderately_restricted", 0.0, 0.0,
1342 kTestDurationSec};
1343 screenshare.config->loss_percent = 1;
1344 screenshare.config->link_capacity_kbps = 1200;
1345 screenshare.config->queue_length_packets = 30;
1346
1347 fixture->RunWithAnalyzer(screenshare);
1348}
1349
1350namespace {
1351// TODO(bugs.webrtc.org/10639) requires simulcast/SVC support in PC framework
1352// Since ParamsWithLogging::Video is not trivially destructible, we can't
1353// store these structs as const globals.
1354ParamsWithLogging::Video SvcVp9Video() {
1355 return ParamsWithLogging::Video{
1356 true, 1280,
1357 720, 30,
1358 800000, 2500000,
1359 2500000, false,
1360 "VP9", 3,
1361 2, 400000,
1362 false, false,
1363 false, ClipNameToClipPath("ConferenceMotion_1280_720_50")};
1364}
1365
1366ParamsWithLogging::Video SimulcastVp8VideoHigh() {
1367 return ParamsWithLogging::Video{
1368 true, 1280,
1369 720, 30,
1370 800000, 2500000,
1371 2500000, false,
1372 "VP8", 3,
1373 2, 400000,
1374 false, false,
1375 false, ClipNameToClipPath("ConferenceMotion_1280_720_50")};
1376}
1377
1378ParamsWithLogging::Video SimulcastVp8VideoMedium() {
1379 return ParamsWithLogging::Video{
1380 true, 640,
1381 360, 30,
1382 150000, 500000,
1383 700000, false,
1384 "VP8", 3,
1385 2, 400000,
1386 false, false,
1387 false, ClipNameToClipPath("ConferenceMotion_1280_720_50")};
1388}
1389
1390ParamsWithLogging::Video SimulcastVp8VideoLow() {
1391 return ParamsWithLogging::Video{
1392 true, 320,
1393 180, 30,
1394 30000, 150000,
1395 200000, false,
1396 "VP8", 3,
1397 2, 400000,
1398 false, false,
1399 false, ClipNameToClipPath("ConferenceMotion_1280_720_50")};
1400}
1401} // namespace
Artem Titov733a7812019-07-24 14:53:15 +02001402*/
Artem Titov137f6c82019-05-17 10:51:15 +02001403
1404#if defined(RTC_ENABLE_VP9)
1405
Artem Titov137f6c82019-05-17 10:51:15 +02001406TEST(PCFullStackTest, ScreenshareSlidesVP9_3SL_High_Fps) {
Artem Titov1e49ab22019-07-30 13:17:25 +02001407 webrtc::test::ScopedFieldTrials override_trials(
1408 AppendFieldTrials("WebRTC-Vp9InterLayerPred/"
1409 "Enabled,inter_layer_pred_mode:on/"));
Artem Titov733a7812019-07-24 14:53:15 +02001410 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
1411 CreateNetworkEmulationManager();
1412 auto fixture = CreateTestFixture(
1413 "pc_screenshare_slides_vp9_3sl_high_fps",
1414 CreateTwoNetworkLinks(network_emulation_manager.get(),
1415 BuiltInNetworkBehaviorConfig()),
1416 [](PeerConfigurer* alice) {
1417 VideoConfig video(1850, 1110, 30);
1418 video.stream_label = "alice-video";
Artem Titov733a7812019-07-24 14:53:15 +02001419 video.simulcast_config = VideoSimulcastConfig(3, 2);
Andrey Logvin435fb9a2020-05-08 08:02:49 +00001420 video.content_hint = VideoTrackInterface::ContentHint::kText;
1421 auto frame_generator = CreateScreenShareFrameGenerator(
1422 video, ScreenShareConfig(TimeDelta::Seconds(10)));
Andrey Logvinc0644672020-05-05 10:33:01 +00001423 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov733a7812019-07-24 14:53:15 +02001424 },
1425 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +01001426 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +01001427 run_params.video_codecs = {VideoCodecConfig(
1428 /*name=*/cricket::kVp9CodecName, /*required_params=*/{
1429 {kVP9FmtpProfileId, VP9ProfileToString(VP9Profile::kProfile0)}})};
Artem Titov733a7812019-07-24 14:53:15 +02001430 run_params.use_flex_fec = false;
1431 run_params.use_ulp_fec = false;
1432 fixture->Run(std::move(run_params));
Artem Titov137f6c82019-05-17 10:51:15 +02001433}
1434
Artem Titov1e49ab22019-07-30 13:17:25 +02001435TEST(PCFullStackTest, VP9SVC_3SL_High) {
1436 webrtc::test::ScopedFieldTrials override_trials(
1437 AppendFieldTrials("WebRTC-Vp9InterLayerPred/"
1438 "Enabled,inter_layer_pred_mode:on/"));
1439 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
1440 CreateNetworkEmulationManager();
1441 auto fixture = CreateTestFixture(
1442 "pc_vp9svc_3sl_high",
1443 CreateTwoNetworkLinks(network_emulation_manager.get(),
1444 BuiltInNetworkBehaviorConfig()),
1445 [](PeerConfigurer* alice) {
1446 VideoConfig video(1280, 720, 30);
1447 video.stream_label = "alice-video";
Artem Titov1e49ab22019-07-30 13:17:25 +02001448 video.simulcast_config = VideoSimulcastConfig(3, 2);
1449 video.temporal_layers_count = 3;
Andrey Logvinc0644672020-05-05 10:33:01 +00001450 auto frame_generator = CreateFromYuvFileFrameGenerator(
1451 video, ClipNameToClipPath("ConferenceMotion_1280_720_50"));
1452 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov1e49ab22019-07-30 13:17:25 +02001453 },
1454 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +01001455 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +01001456 run_params.video_codecs = {VideoCodecConfig(
1457 /*name=*/cricket::kVp9CodecName, /*required_params=*/{
1458 {kVP9FmtpProfileId, VP9ProfileToString(VP9Profile::kProfile0)}})};
Artem Titov1e49ab22019-07-30 13:17:25 +02001459 run_params.use_flex_fec = false;
1460 run_params.use_ulp_fec = false;
1461 fixture->Run(std::move(run_params));
1462}
1463
Artem Titov1e49ab22019-07-30 13:17:25 +02001464TEST(PCFullStackTest, VP9SVC_3SL_Low) {
1465 webrtc::test::ScopedFieldTrials override_trials(
1466 AppendFieldTrials("WebRTC-Vp9InterLayerPred/"
1467 "Enabled,inter_layer_pred_mode:on/"));
1468 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
1469 CreateNetworkEmulationManager();
1470 auto fixture = CreateTestFixture(
1471 "pc_vp9svc_3sl_low",
1472 CreateTwoNetworkLinks(network_emulation_manager.get(),
1473 BuiltInNetworkBehaviorConfig()),
1474 [](PeerConfigurer* alice) {
1475 VideoConfig video(1280, 720, 30);
1476 video.stream_label = "alice-video";
Artem Titov1e49ab22019-07-30 13:17:25 +02001477 video.simulcast_config = VideoSimulcastConfig(3, 0);
1478 video.temporal_layers_count = 3;
Andrey Logvinc0644672020-05-05 10:33:01 +00001479 auto frame_generator = CreateFromYuvFileFrameGenerator(
1480 video, ClipNameToClipPath("ConferenceMotion_1280_720_50"));
1481 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov1e49ab22019-07-30 13:17:25 +02001482 },
1483 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +01001484 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +01001485 run_params.video_codecs = {VideoCodecConfig(
1486 /*name=*/cricket::kVp9CodecName, /*required_params=*/{
1487 {kVP9FmtpProfileId, VP9ProfileToString(VP9Profile::kProfile0)}})};
Artem Titov1e49ab22019-07-30 13:17:25 +02001488 run_params.use_flex_fec = false;
1489 run_params.use_ulp_fec = false;
1490 fixture->Run(std::move(run_params));
1491}
1492
Artem Titov733a7812019-07-24 14:53:15 +02001493#endif // defined(RTC_ENABLE_VP9)
1494
1495/*
Artem Titov137f6c82019-05-17 10:51:15 +02001496// bugs.webrtc.org/9506
1497#if !defined(WEBRTC_MAC)
1498
1499// TODO(bugs.webrtc.org/10639) requires simulcast/SVC support in PC framework
1500TEST(PCFullStackTest, VP9KSVC_3SL_High) {
1501 webrtc::test::ScopedFieldTrials override_trials(
1502 AppendFieldTrials("WebRTC-Vp9IssueKeyFrameOnLayerDeactivation/Enabled/"));
1503 auto fixture = CreateVideoQualityTestFixture();
1504 ParamsWithLogging simulcast;
1505 simulcast.call.send_side_bwe = true;
1506 simulcast.video[0] = SvcVp9Video();
1507 simulcast.analyzer = {"vp9ksvc_3sl_high", 0.0, 0.0, kTestDurationSec};
1508 simulcast.ss[0] = {
1509 std::vector<VideoStream>(), 0, 3, 2, InterLayerPredMode::kOnKeyPic,
1510 std::vector<SpatialLayer>(), false};
1511 fixture->RunWithAnalyzer(simulcast);
1512}
1513
1514// TODO(bugs.webrtc.org/10639) requires simulcast/SVC support in PC framework
1515TEST(PCFullStackTest, VP9KSVC_3SL_Medium) {
1516 webrtc::test::ScopedFieldTrials override_trials(
1517 AppendFieldTrials("WebRTC-Vp9IssueKeyFrameOnLayerDeactivation/Enabled/"));
1518 auto fixture = CreateVideoQualityTestFixture();
1519 ParamsWithLogging simulcast;
1520 simulcast.call.send_side_bwe = true;
1521 simulcast.video[0] = SvcVp9Video();
1522 simulcast.analyzer = {"vp9ksvc_3sl_medium", 0.0, 0.0, kTestDurationSec};
1523 simulcast.ss[0] = {
1524 std::vector<VideoStream>(), 0, 3, 1, InterLayerPredMode::kOnKeyPic,
1525 std::vector<SpatialLayer>(), false};
1526 fixture->RunWithAnalyzer(simulcast);
1527}
1528
1529// TODO(bugs.webrtc.org/10639) requires simulcast/SVC support in PC framework
1530TEST(PCFullStackTest, VP9KSVC_3SL_Low) {
1531 webrtc::test::ScopedFieldTrials override_trials(
1532 AppendFieldTrials("WebRTC-Vp9IssueKeyFrameOnLayerDeactivation/Enabled/"));
1533 auto fixture = CreateVideoQualityTestFixture();
1534 ParamsWithLogging simulcast;
1535 simulcast.call.send_side_bwe = true;
1536 simulcast.video[0] = SvcVp9Video();
1537 simulcast.analyzer = {"vp9ksvc_3sl_low", 0.0, 0.0, kTestDurationSec};
1538 simulcast.ss[0] = {
1539 std::vector<VideoStream>(), 0, 3, 0, InterLayerPredMode::kOnKeyPic,
1540 std::vector<SpatialLayer>(), false};
1541 fixture->RunWithAnalyzer(simulcast);
1542}
1543
1544// TODO(bugs.webrtc.org/10639) requires simulcast/SVC support in PC framework
1545TEST(PCFullStackTest, VP9KSVC_3SL_Medium_Network_Restricted) {
1546 webrtc::test::ScopedFieldTrials override_trials(
1547 AppendFieldTrials("WebRTC-Vp9IssueKeyFrameOnLayerDeactivation/Enabled/"));
1548 auto fixture = CreateVideoQualityTestFixture();
1549 ParamsWithLogging simulcast;
1550 simulcast.call.send_side_bwe = true;
1551 simulcast.video[0] = SvcVp9Video();
1552 simulcast.analyzer = {"vp9ksvc_3sl_medium_network_restricted", 0.0, 0.0,
1553 kTestDurationSec};
1554 simulcast.ss[0] = {
1555 std::vector<VideoStream>(), 0, 3, -1, InterLayerPredMode::kOnKeyPic,
1556 std::vector<SpatialLayer>(), false};
1557 simulcast.config->link_capacity_kbps = 1000;
1558 simulcast.config->queue_delay_ms = 100;
1559 fixture->RunWithAnalyzer(simulcast);
1560}
1561
1562// TODO(bugs.webrtc.org/10639) requires simulcast/SVC support in PC framework
1563// TODO(webrtc:9722): Remove when experiment is cleaned up.
1564TEST(PCFullStackTest, VP9KSVC_3SL_Medium_Network_Restricted_Trusted_Rate) {
1565 webrtc::test::ScopedFieldTrials override_trials(
1566 AppendFieldTrials("WebRTC-Vp9IssueKeyFrameOnLayerDeactivation/Enabled/"
1567 "WebRTC-LibvpxVp9TrustedRateController/Enabled/"));
1568 auto fixture = CreateVideoQualityTestFixture();
1569 ParamsWithLogging simulcast;
1570 simulcast.call.send_side_bwe = true;
1571 simulcast.video[0] = SvcVp9Video();
1572 simulcast.analyzer = {"vp9ksvc_3sl_medium_network_restricted_trusted_rate",
1573 0.0, 0.0, kTestDurationSec};
1574 simulcast.ss[0] = {
1575 std::vector<VideoStream>(), 0, 3, -1, InterLayerPredMode::kOnKeyPic,
1576 std::vector<SpatialLayer>(), false};
1577 simulcast.config->link_capacity_kbps = 1000;
1578 simulcast.config->queue_delay_ms = 100;
1579 fixture->RunWithAnalyzer(simulcast);
1580}
1581#endif // !defined(WEBRTC_MAC)
1582
1583#endif // defined(RTC_ENABLE_VP9)
Artem Titov39483c62019-07-19 17:03:52 +02001584*/
Artem Titov137f6c82019-05-17 10:51:15 +02001585
1586// Android bots can't handle FullHD, so disable the test.
1587// TODO(bugs.webrtc.org/9220): Investigate source of flakiness on Mac.
1588#if defined(WEBRTC_ANDROID) || defined(WEBRTC_MAC)
1589#define MAYBE_SimulcastFullHdOveruse DISABLED_SimulcastFullHdOveruse
1590#else
1591#define MAYBE_SimulcastFullHdOveruse SimulcastFullHdOveruse
1592#endif
Artem Titov137f6c82019-05-17 10:51:15 +02001593TEST(PCFullStackTest, MAYBE_SimulcastFullHdOveruse) {
Artem Titov137f6c82019-05-17 10:51:15 +02001594 webrtc::test::ScopedFieldTrials override_trials(AppendFieldTrials(
1595 "WebRTC-ForceSimulatedOveruseIntervalMs/1000-50000-300/"));
Artem Titov39483c62019-07-19 17:03:52 +02001596 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
1597 CreateNetworkEmulationManager();
1598 BuiltInNetworkBehaviorConfig config;
1599 config.loss_percent = 0;
1600 config.queue_delay_ms = 100;
1601 auto fixture = CreateTestFixture(
1602 "pc_simulcast_HD_high",
1603 CreateTwoNetworkLinks(network_emulation_manager.get(), config),
1604 [](PeerConfigurer* alice) {
1605 VideoConfig video(1920, 1080, 30);
Artem Titov39483c62019-07-19 17:03:52 +02001606 video.simulcast_config = VideoSimulcastConfig(3, 2);
Artem Titov4b9701e2019-08-28 13:48:02 +02001607 video.temporal_layers_count = 3;
Artem Titov39483c62019-07-19 17:03:52 +02001608 video.stream_label = "alice-video";
Andrey Logvin42c59522020-05-06 12:18:26 +00001609 alice->AddVideoConfig(std::move(video));
Artem Titov39483c62019-07-19 17:03:52 +02001610 },
1611 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +01001612 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +01001613 run_params.video_codecs = {VideoCodecConfig(cricket::kVp8CodecName)};
Artem Titov39483c62019-07-19 17:03:52 +02001614 run_params.use_flex_fec = false;
1615 run_params.use_ulp_fec = false;
1616 fixture->Run(std::move(run_params));
Artem Titov137f6c82019-05-17 10:51:15 +02001617}
1618
Artem Titov137f6c82019-05-17 10:51:15 +02001619TEST(PCFullStackTest, SimulcastVP8_3SL_High) {
Artem Titov39483c62019-07-19 17:03:52 +02001620 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
1621 CreateNetworkEmulationManager();
1622 BuiltInNetworkBehaviorConfig config;
1623 config.loss_percent = 0;
1624 config.queue_delay_ms = 100;
1625 auto fixture = CreateTestFixture(
1626 "pc_simulcast_vp8_3sl_high",
1627 CreateTwoNetworkLinks(network_emulation_manager.get(), config),
1628 [](PeerConfigurer* alice) {
1629 VideoConfig video(1280, 720, 30);
Artem Titov39483c62019-07-19 17:03:52 +02001630 video.simulcast_config = VideoSimulcastConfig(3, 2);
1631 video.stream_label = "alice-video";
Andrey Logvinc0644672020-05-05 10:33:01 +00001632 auto frame_generator = CreateFromYuvFileFrameGenerator(
1633 video, ClipNameToClipPath("ConferenceMotion_1280_720_50"));
1634 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov39483c62019-07-19 17:03:52 +02001635 },
1636 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +01001637 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +01001638 run_params.video_codecs = {VideoCodecConfig(cricket::kVp8CodecName)};
Artem Titov39483c62019-07-19 17:03:52 +02001639 run_params.use_flex_fec = false;
1640 run_params.use_ulp_fec = false;
1641 fixture->Run(std::move(run_params));
Artem Titov137f6c82019-05-17 10:51:15 +02001642}
1643
Artem Titov137f6c82019-05-17 10:51:15 +02001644TEST(PCFullStackTest, SimulcastVP8_3SL_Low) {
Artem Titov39483c62019-07-19 17:03:52 +02001645 std::unique_ptr<NetworkEmulationManager> network_emulation_manager =
1646 CreateNetworkEmulationManager();
1647 BuiltInNetworkBehaviorConfig config;
1648 config.loss_percent = 0;
1649 config.queue_delay_ms = 100;
1650 auto fixture = CreateTestFixture(
1651 "pc_simulcast_vp8_3sl_low",
1652 CreateTwoNetworkLinks(network_emulation_manager.get(), config),
1653 [](PeerConfigurer* alice) {
1654 VideoConfig video(1280, 720, 30);
Artem Titov39483c62019-07-19 17:03:52 +02001655 video.simulcast_config = VideoSimulcastConfig(3, 0);
1656 video.stream_label = "alice-video";
Andrey Logvinc0644672020-05-05 10:33:01 +00001657 auto frame_generator = CreateFromYuvFileFrameGenerator(
1658 video, ClipNameToClipPath("ConferenceMotion_1280_720_50"));
1659 alice->AddVideoConfig(std::move(video), std::move(frame_generator));
Artem Titov39483c62019-07-19 17:03:52 +02001660 },
1661 [](PeerConfigurer* bob) {});
Danil Chapovalov0c626af2020-02-10 11:16:00 +01001662 RunParams run_params(TimeDelta::Seconds(kTestDurationSec));
Artem Titovcdd73e02020-01-23 14:09:09 +01001663 run_params.video_codecs = {VideoCodecConfig(cricket::kVp8CodecName)};
Artem Titov39483c62019-07-19 17:03:52 +02001664 run_params.use_flex_fec = false;
1665 run_params.use_ulp_fec = false;
1666 fixture->Run(std::move(run_params));
Artem Titov137f6c82019-05-17 10:51:15 +02001667}
1668
Artem Titov39483c62019-07-19 17:03:52 +02001669/*
Artem Titov137f6c82019-05-17 10:51:15 +02001670// This test assumes ideal network conditions with target bandwidth being
1671// available and exercises WebRTC calls with a high target bitrate(100 Mbps).
1672// Android32 bots can't handle this high bitrate, so disable test for those.
1673#if defined(WEBRTC_ANDROID)
1674#define MAYBE_HighBitrateWithFakeCodec DISABLED_HighBitrateWithFakeCodec
1675#else
1676#define MAYBE_HighBitrateWithFakeCodec HighBitrateWithFakeCodec
1677#endif // defined(WEBRTC_ANDROID)
1678// TODO(bugs.webrtc.org/10639) Disabled because target bitrate can't be
1679configured yet. TEST(PCFullStackTest, MAYBE_HighBitrateWithFakeCodec) { auto
1680fixture = CreateVideoQualityTestFixture(); const int target_bitrate = 100000000;
1681 ParamsWithLogging generator;
1682 generator.call.send_side_bwe = true;
1683 generator.call.call_bitrate_config.min_bitrate_bps = target_bitrate;
1684 generator.call.call_bitrate_config.start_bitrate_bps = target_bitrate;
1685 generator.call.call_bitrate_config.max_bitrate_bps = target_bitrate;
1686 generator.video[0] = {true,
1687 360,
1688 240,
1689 30,
1690 target_bitrate / 2,
1691 target_bitrate,
1692 target_bitrate * 2,
1693 false,
1694 "FakeCodec",
1695 1,
1696 0,
1697 0,
1698 false,
1699 false,
1700 false,
1701 "Generator"};
1702 generator.analyzer = {"high_bitrate_with_fake_codec", 0.0, 0.0,
1703 kTestDurationSec};
1704 fixture->RunWithAnalyzer(generator);
1705}
1706
1707// TODO(bugs.webrtc.org/10639) requires simulcast/SVC support in PC framework
1708TEST(PCFullStackTest, LargeRoomVP8_5thumb) {
1709 auto fixture = CreateVideoQualityTestFixture();
1710 ParamsWithLogging large_room;
1711 large_room.call.send_side_bwe = true;
1712 large_room.video[0] = SimulcastVp8VideoHigh();
1713 large_room.analyzer = {"largeroom_5thumb", 0.0, 0.0, kTestDurationSec};
1714 large_room.config->loss_percent = 0;
1715 large_room.config->queue_delay_ms = 100;
1716 ParamsWithLogging video_params_high;
1717 video_params_high.video[0] = SimulcastVp8VideoHigh();
1718 ParamsWithLogging video_params_medium;
1719 video_params_medium.video[0] = SimulcastVp8VideoMedium();
1720 ParamsWithLogging video_params_low;
1721 video_params_low.video[0] = SimulcastVp8VideoLow();
1722
1723 std::vector<VideoStream> streams = {
1724 VideoQualityTest::DefaultVideoStream(video_params_low, 0),
1725 VideoQualityTest::DefaultVideoStream(video_params_medium, 0),
1726 VideoQualityTest::DefaultVideoStream(video_params_high, 0)};
1727 large_room.call.num_thumbnails = 5;
1728 large_room.ss[0] = {
1729 streams, 2, 1, 0, InterLayerPredMode::kOn, std::vector<SpatialLayer>(),
1730 false};
1731 fixture->RunWithAnalyzer(large_room);
1732}
1733
1734#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
1735// Fails on mobile devices:
1736// https://bugs.chromium.org/p/webrtc/issues/detail?id=7301
1737#define MAYBE_LargeRoomVP8_50thumb DISABLED_LargeRoomVP8_50thumb
1738#define MAYBE_LargeRoomVP8_15thumb DISABLED_LargeRoomVP8_15thumb
1739#else
1740#define MAYBE_LargeRoomVP8_50thumb LargeRoomVP8_50thumb
1741#define MAYBE_LargeRoomVP8_15thumb LargeRoomVP8_15thumb
1742#endif
1743// TODO(bugs.webrtc.org/10639) requires simulcast/SVC support in PC framework
1744TEST(PCFullStackTest, MAYBE_LargeRoomVP8_15thumb) {
1745 auto fixture = CreateVideoQualityTestFixture();
1746 ParamsWithLogging large_room;
1747 large_room.call.send_side_bwe = true;
1748 large_room.video[0] = SimulcastVp8VideoHigh();
1749 large_room.analyzer = {"largeroom_15thumb", 0.0, 0.0, kTestDurationSec};
1750 large_room.config->loss_percent = 0;
1751 large_room.config->queue_delay_ms = 100;
1752 ParamsWithLogging video_params_high;
1753 video_params_high.video[0] = SimulcastVp8VideoHigh();
1754 ParamsWithLogging video_params_medium;
1755 video_params_medium.video[0] = SimulcastVp8VideoMedium();
1756 ParamsWithLogging video_params_low;
1757 video_params_low.video[0] = SimulcastVp8VideoLow();
1758
1759 std::vector<VideoStream> streams = {
1760 VideoQualityTest::DefaultVideoStream(video_params_low, 0),
1761 VideoQualityTest::DefaultVideoStream(video_params_medium, 0),
1762 VideoQualityTest::DefaultVideoStream(video_params_high, 0)};
1763 large_room.call.num_thumbnails = 15;
1764 large_room.ss[0] = {
1765 streams, 2, 1, 0, InterLayerPredMode::kOn, std::vector<SpatialLayer>(),
1766 false};
1767 fixture->RunWithAnalyzer(large_room);
1768}
1769
1770// TODO(bugs.webrtc.org/10639) requires simulcast/SVC support in PC framework
1771TEST(PCFullStackTest, MAYBE_LargeRoomVP8_50thumb) {
1772 auto fixture = CreateVideoQualityTestFixture();
1773 ParamsWithLogging large_room;
1774 large_room.call.send_side_bwe = true;
1775 large_room.video[0] = SimulcastVp8VideoHigh();
1776 large_room.analyzer = {"largeroom_50thumb", 0.0, 0.0, kTestDurationSec};
1777 large_room.config->loss_percent = 0;
1778 large_room.config->queue_delay_ms = 100;
1779 ParamsWithLogging video_params_high;
1780 video_params_high.video[0] = SimulcastVp8VideoHigh();
1781 ParamsWithLogging video_params_medium;
1782 video_params_medium.video[0] = SimulcastVp8VideoMedium();
1783 ParamsWithLogging video_params_low;
1784 video_params_low.video[0] = SimulcastVp8VideoLow();
1785
1786 std::vector<VideoStream> streams = {
1787 VideoQualityTest::DefaultVideoStream(video_params_low, 0),
1788 VideoQualityTest::DefaultVideoStream(video_params_medium, 0),
1789 VideoQualityTest::DefaultVideoStream(video_params_high, 0)};
1790 large_room.call.num_thumbnails = 50;
1791 large_room.ss[0] = {
1792 streams, 2, 1, 0, InterLayerPredMode::kOn, std::vector<SpatialLayer>(),
1793 false};
1794 fixture->RunWithAnalyzer(large_room);
1795}
1796*/
1797
Artem Titov137f6c82019-05-17 10:51:15 +02001798class PCDualStreamsTest : public ::testing::TestWithParam<int> {};
1799
1800/*
1801// Disable dual video test on mobile device becuase it's too heavy.
1802// TODO(bugs.webrtc.org/9840): Investigate why is this test flaky on MAC.
1803#if !defined(WEBRTC_ANDROID) && !defined(WEBRTC_IOS) && !defined(WEBRTC_MAC)
1804// TODO(bugs.webrtc.org/10639) requires simulcast/SVC support in PC framework
1805TEST_P(PCDualStreamsTest,
1806 ModeratelyRestricted_SlidesVp8_2TL_Simulcast_Video_Simulcast_High) {
Artem Titov137f6c82019-05-17 10:51:15 +02001807 const int first_stream = GetParam();
1808 ParamsWithLogging dual_streams;
1809
1810 // Screenshare Settings.
1811 dual_streams.screenshare[first_stream] = {true, false, 10};
1812 dual_streams.video[first_stream] = {true, 1850, 1110, 5, 800000, 2500000,
1813 2500000, false, "VP8", 2, 1, 400000,
1814 false, false, false, ""};
1815
1816 ParamsWithLogging screenshare_params_high;
1817 screenshare_params_high.video[0] = {
1818 true, 1850, 1110, 60, 600000, 1250000, 1250000, false,
1819 "VP8", 2, 0, 400000, false, false, false, ""};
1820 VideoQualityTest::Params screenshare_params_low;
1821 screenshare_params_low.video[0] = {true, 1850, 1110, 5, 30000, 200000,
1822 1000000, false, "VP8", 2, 0, 400000,
1823 false, false, false, ""};
1824 std::vector<VideoStream> screenhsare_streams = {
1825 VideoQualityTest::DefaultVideoStream(screenshare_params_low, 0),
1826 VideoQualityTest::DefaultVideoStream(screenshare_params_high, 0)};
1827
1828 dual_streams.ss[first_stream] = {
1829 screenhsare_streams, 1, 1, 0, InterLayerPredMode::kOn,
1830 std::vector<SpatialLayer>(), false};
1831
1832 // Video settings.
1833 dual_streams.video[1 - first_stream] = SimulcastVp8VideoHigh();
1834
1835 ParamsWithLogging video_params_high;
1836 video_params_high.video[0] = SimulcastVp8VideoHigh();
1837 ParamsWithLogging video_params_medium;
1838 video_params_medium.video[0] = SimulcastVp8VideoMedium();
1839 ParamsWithLogging video_params_low;
1840 video_params_low.video[0] = SimulcastVp8VideoLow();
1841 std::vector<VideoStream> streams = {
1842 VideoQualityTest::DefaultVideoStream(video_params_low, 0),
1843 VideoQualityTest::DefaultVideoStream(video_params_medium, 0),
1844 VideoQualityTest::DefaultVideoStream(video_params_high, 0)};
1845
1846 dual_streams.ss[1 - first_stream] = {
1847 streams, 2, 1, 0, InterLayerPredMode::kOn, std::vector<SpatialLayer>(),
1848 false};
1849
1850 // Call settings.
1851 dual_streams.call.send_side_bwe = true;
1852 dual_streams.call.dual_video = true;
1853 std::string test_label = "dualstreams_moderately_restricted_screenshare_" +
1854 std::to_string(first_stream);
1855 dual_streams.analyzer = {test_label, 0.0, 0.0, kTestDurationSec};
1856 dual_streams.config->loss_percent = 1;
1857 dual_streams.config->link_capacity_kbps = 7500;
1858 dual_streams.config->queue_length_packets = 30;
1859 dual_streams.config->queue_delay_ms = 100;
1860
1861 auto fixture = CreateVideoQualityTestFixture();
1862 fixture->RunWithAnalyzer(dual_streams);
1863}
1864#endif // !defined(WEBRTC_ANDROID) && !defined(WEBRTC_IOS) &&
1865 // !defined(WEBRTC_MAC)
1866
1867// TODO(bugs.webrtc.org/10639) requires simulcast/SVC support in PC framework
1868TEST_P(PCDualStreamsTest, Conference_Restricted) {
1869 const int first_stream = GetParam();
1870 ParamsWithLogging dual_streams;
1871
1872 // Screenshare Settings.
1873 dual_streams.screenshare[first_stream] = {true, false, 10};
1874 dual_streams.video[first_stream] = {true, 1850, 1110, 5, 800000, 2500000,
1875 2500000, false, "VP8", 3, 2, 400000,
1876 false, false, false, ""};
1877 // Video settings.
1878 dual_streams.video[1 - first_stream] = {
1879 true, 1280,
1880 720, 30,
1881 150000, 500000,
1882 700000, false,
1883 "VP8", 3,
1884 2, 400000,
1885 false, false,
1886 false, ClipNameToClipPath("ConferenceMotion_1280_720_50")};
1887
1888 // Call settings.
1889 dual_streams.call.send_side_bwe = true;
1890 dual_streams.call.dual_video = true;
1891 std::string test_label = "dualstreams_conference_restricted_screenshare_" +
1892 std::to_string(first_stream);
1893 dual_streams.analyzer = {test_label, 0.0, 0.0, kTestDurationSec};
1894 dual_streams.config->loss_percent = 1;
1895 dual_streams.config->link_capacity_kbps = 5000;
1896 dual_streams.config->queue_length_packets = 30;
1897 dual_streams.config->queue_delay_ms = 100;
1898
1899 auto fixture = CreateVideoQualityTestFixture();
1900 fixture->RunWithAnalyzer(dual_streams);
1901}
1902*/
1903
1904INSTANTIATE_TEST_SUITE_P(PCFullStackTest,
1905 PCDualStreamsTest,
1906 ::testing::Values(0, 1));
1907
1908} // namespace webrtc