blob: ab057be028bb5fc4fea7cb3680fc41a23e358433 [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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "call/callfactory.h"
zhihuang38ede132017-06-15 12:52:32 -070012
13#include <memory>
Erik Språng09708512018-03-14 15:16:50 +010014#include <string>
15#include <utility>
zhihuang38ede132017-06-15 12:52:32 -070016
Danil Chapovalovb9b146c2018-06-15 12:28:07 +020017#include "absl/types/optional.h"
Niels Möller8366e172018-02-14 12:20:13 +010018#include "call/call.h"
Erik Språng09708512018-03-14 15:16:50 +010019#include "call/degraded_call.h"
20#include "call/fake_network_pipe.h"
21#include "system_wrappers/include/field_trial.h"
Niels Möller8366e172018-02-14 12:20:13 +010022
zhihuang38ede132017-06-15 12:52:32 -070023namespace webrtc {
Erik Språng09708512018-03-14 15:16:50 +010024namespace {
25bool ParseConfigParam(std::string exp_name, int* field) {
26 std::string group = field_trial::FindFullName(exp_name);
27 if (group == "")
28 return false;
29
30 return (sscanf(group.c_str(), "%d", field) == 1);
31}
32
Artem Titov75e36472018-10-08 12:28:56 +020033absl::optional<webrtc::BuiltInNetworkBehaviorConfig> ParseDegradationConfig(
Erik Språng09708512018-03-14 15:16:50 +010034 bool send) {
35 std::string exp_prefix = "WebRTCFakeNetwork";
36 if (send) {
37 exp_prefix += "Send";
38 } else {
39 exp_prefix += "Receive";
40 }
41
Artem Titov75e36472018-10-08 12:28:56 +020042 webrtc::BuiltInNetworkBehaviorConfig config;
Erik Språng09708512018-03-14 15:16:50 +010043 bool configured = false;
44 configured |=
45 ParseConfigParam(exp_prefix + "DelayMs", &config.queue_delay_ms);
46 configured |= ParseConfigParam(exp_prefix + "DelayStdDevMs",
47 &config.delay_standard_deviation_ms);
48 int queue_length = 0;
49 if (ParseConfigParam(exp_prefix + "QueueLength", &queue_length)) {
50 RTC_CHECK_GE(queue_length, 0);
51 config.queue_length_packets = queue_length;
52 configured = true;
53 }
54 configured |=
55 ParseConfigParam(exp_prefix + "CapacityKbps", &config.link_capacity_kbps);
56 configured |=
57 ParseConfigParam(exp_prefix + "LossPercent", &config.loss_percent);
58 int allow_reordering = 0;
59 if (ParseConfigParam(exp_prefix + "AllowReordering", &allow_reordering)) {
60 config.allow_reordering = true;
61 configured = true;
62 }
63 configured |= ParseConfigParam(exp_prefix + "AvgBurstLossLength",
64 &config.avg_burst_loss_length);
Artem Titov4ff63cc2018-08-23 10:54:54 +020065 return configured
Artem Titov75e36472018-10-08 12:28:56 +020066 ? absl::optional<webrtc::BuiltInNetworkBehaviorConfig>(config)
Artem Titov4ff63cc2018-08-23 10:54:54 +020067 : absl::nullopt;
Erik Språng09708512018-03-14 15:16:50 +010068}
69} // namespace
zhihuang38ede132017-06-15 12:52:32 -070070
71Call* CallFactory::CreateCall(const Call::Config& config) {
Artem Titov75e36472018-10-08 12:28:56 +020072 absl::optional<webrtc::BuiltInNetworkBehaviorConfig> send_degradation_config =
73 ParseDegradationConfig(true);
74 absl::optional<webrtc::BuiltInNetworkBehaviorConfig>
Artem Titov4ff63cc2018-08-23 10:54:54 +020075 receive_degradation_config = ParseDegradationConfig(false);
Erik Språng09708512018-03-14 15:16:50 +010076
77 if (send_degradation_config || receive_degradation_config) {
78 return new DegradedCall(std::unique_ptr<Call>(Call::Create(config)),
79 send_degradation_config,
80 receive_degradation_config);
81 }
82
zhihuang38ede132017-06-15 12:52:32 -070083 return Call::Create(config);
84}
85
86std::unique_ptr<CallFactoryInterface> CreateCallFactory() {
87 return std::unique_ptr<CallFactoryInterface>(new CallFactory());
88}
89
90} // namespace webrtc