blob: 309063d0858fb5a0c14ed85ab6223a39ba4fa328 [file] [log] [blame]
zhihuang38ede132017-06-15 12:52:32 -07001/*
2 * Copyright 2017 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
Steve Anton10542f22019-01-11 09:11:00 -080011#include "call/call_factory.h"
zhihuang38ede132017-06-15 12:52:32 -070012
Yves Gerey3e707812018-11-28 16:47:49 +010013#include <stdio.h>
zhihuang38ede132017-06-15 12:52:32 -070014#include <memory>
Erik Språng09708512018-03-14 15:16:50 +010015#include <string>
zhihuang38ede132017-06-15 12:52:32 -070016
Danil Chapovalovb9b146c2018-06-15 12:28:07 +020017#include "absl/types/optional.h"
Yves Gerey3e707812018-11-28 16:47:49 +010018#include "api/test/simulated_network.h"
Niels Möller8366e172018-02-14 12:20:13 +010019#include "call/call.h"
Erik Språng09708512018-03-14 15:16:50 +010020#include "call/degraded_call.h"
Yves Gerey3e707812018-11-28 16:47:49 +010021#include "rtc_base/checks.h"
Erik Språng09708512018-03-14 15:16:50 +010022#include "system_wrappers/include/field_trial.h"
Niels Möller8366e172018-02-14 12:20:13 +010023
zhihuang38ede132017-06-15 12:52:32 -070024namespace webrtc {
Erik Språng09708512018-03-14 15:16:50 +010025namespace {
26bool ParseConfigParam(std::string exp_name, int* field) {
27 std::string group = field_trial::FindFullName(exp_name);
28 if (group == "")
29 return false;
30
31 return (sscanf(group.c_str(), "%d", field) == 1);
32}
33
Artem Titov75e36472018-10-08 12:28:56 +020034absl::optional<webrtc::BuiltInNetworkBehaviorConfig> ParseDegradationConfig(
Erik Språng09708512018-03-14 15:16:50 +010035 bool send) {
36 std::string exp_prefix = "WebRTCFakeNetwork";
37 if (send) {
38 exp_prefix += "Send";
39 } else {
40 exp_prefix += "Receive";
41 }
42
Artem Titov75e36472018-10-08 12:28:56 +020043 webrtc::BuiltInNetworkBehaviorConfig config;
Erik Språng09708512018-03-14 15:16:50 +010044 bool configured = false;
45 configured |=
46 ParseConfigParam(exp_prefix + "DelayMs", &config.queue_delay_ms);
47 configured |= ParseConfigParam(exp_prefix + "DelayStdDevMs",
48 &config.delay_standard_deviation_ms);
49 int queue_length = 0;
50 if (ParseConfigParam(exp_prefix + "QueueLength", &queue_length)) {
51 RTC_CHECK_GE(queue_length, 0);
52 config.queue_length_packets = queue_length;
53 configured = true;
54 }
55 configured |=
56 ParseConfigParam(exp_prefix + "CapacityKbps", &config.link_capacity_kbps);
57 configured |=
58 ParseConfigParam(exp_prefix + "LossPercent", &config.loss_percent);
59 int allow_reordering = 0;
60 if (ParseConfigParam(exp_prefix + "AllowReordering", &allow_reordering)) {
61 config.allow_reordering = true;
62 configured = true;
63 }
64 configured |= ParseConfigParam(exp_prefix + "AvgBurstLossLength",
65 &config.avg_burst_loss_length);
Artem Titov4ff63cc2018-08-23 10:54:54 +020066 return configured
Artem Titov75e36472018-10-08 12:28:56 +020067 ? absl::optional<webrtc::BuiltInNetworkBehaviorConfig>(config)
Artem Titov4ff63cc2018-08-23 10:54:54 +020068 : absl::nullopt;
Erik Språng09708512018-03-14 15:16:50 +010069}
70} // namespace
zhihuang38ede132017-06-15 12:52:32 -070071
72Call* CallFactory::CreateCall(const Call::Config& config) {
Artem Titov75e36472018-10-08 12:28:56 +020073 absl::optional<webrtc::BuiltInNetworkBehaviorConfig> send_degradation_config =
74 ParseDegradationConfig(true);
75 absl::optional<webrtc::BuiltInNetworkBehaviorConfig>
Artem Titov4ff63cc2018-08-23 10:54:54 +020076 receive_degradation_config = ParseDegradationConfig(false);
Erik Språng09708512018-03-14 15:16:50 +010077
78 if (send_degradation_config || receive_degradation_config) {
79 return new DegradedCall(std::unique_ptr<Call>(Call::Create(config)),
80 send_degradation_config,
81 receive_degradation_config);
82 }
83
zhihuang38ede132017-06-15 12:52:32 -070084 return Call::Create(config);
85}
86
87std::unique_ptr<CallFactoryInterface> CreateCallFactory() {
88 return std::unique_ptr<CallFactoryInterface>(new CallFactory());
89}
90
91} // namespace webrtc