blob: 6b4f41974257114964fc4b10df31ebae41e00fd4 [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>
Jonas Olssona4d87372019-07-05 19:08:33 +020014
zhihuang38ede132017-06-15 12:52:32 -070015#include <memory>
Erik Språng09708512018-03-14 15:16:50 +010016#include <string>
zhihuang38ede132017-06-15 12:52:32 -070017
Danil Chapovalovb9b146c2018-06-15 12:28:07 +020018#include "absl/types/optional.h"
Yves Gerey3e707812018-11-28 16:47:49 +010019#include "api/test/simulated_network.h"
Niels Möller8366e172018-02-14 12:20:13 +010020#include "call/call.h"
Erik Språng09708512018-03-14 15:16:50 +010021#include "call/degraded_call.h"
Yves Gerey3e707812018-11-28 16:47:49 +010022#include "rtc_base/checks.h"
Erik Språng09708512018-03-14 15:16:50 +010023#include "system_wrappers/include/field_trial.h"
Niels Möller8366e172018-02-14 12:20:13 +010024
zhihuang38ede132017-06-15 12:52:32 -070025namespace webrtc {
Erik Språng09708512018-03-14 15:16:50 +010026namespace {
27bool ParseConfigParam(std::string exp_name, int* field) {
28 std::string group = field_trial::FindFullName(exp_name);
Benjamin Wright41f9f2c2019-03-13 18:03:29 -070029 if (group.empty())
Erik Språng09708512018-03-14 15:16:50 +010030 return false;
31
32 return (sscanf(group.c_str(), "%d", field) == 1);
33}
34
Artem Titov75e36472018-10-08 12:28:56 +020035absl::optional<webrtc::BuiltInNetworkBehaviorConfig> ParseDegradationConfig(
Erik Språng09708512018-03-14 15:16:50 +010036 bool send) {
37 std::string exp_prefix = "WebRTCFakeNetwork";
38 if (send) {
39 exp_prefix += "Send";
40 } else {
41 exp_prefix += "Receive";
42 }
43
Artem Titov75e36472018-10-08 12:28:56 +020044 webrtc::BuiltInNetworkBehaviorConfig config;
Erik Språng09708512018-03-14 15:16:50 +010045 bool configured = false;
46 configured |=
47 ParseConfigParam(exp_prefix + "DelayMs", &config.queue_delay_ms);
48 configured |= ParseConfigParam(exp_prefix + "DelayStdDevMs",
49 &config.delay_standard_deviation_ms);
50 int queue_length = 0;
51 if (ParseConfigParam(exp_prefix + "QueueLength", &queue_length)) {
52 RTC_CHECK_GE(queue_length, 0);
53 config.queue_length_packets = queue_length;
54 configured = true;
55 }
56 configured |=
57 ParseConfigParam(exp_prefix + "CapacityKbps", &config.link_capacity_kbps);
58 configured |=
59 ParseConfigParam(exp_prefix + "LossPercent", &config.loss_percent);
60 int allow_reordering = 0;
61 if (ParseConfigParam(exp_prefix + "AllowReordering", &allow_reordering)) {
62 config.allow_reordering = true;
63 configured = true;
64 }
65 configured |= ParseConfigParam(exp_prefix + "AvgBurstLossLength",
66 &config.avg_burst_loss_length);
Artem Titov4ff63cc2018-08-23 10:54:54 +020067 return configured
Artem Titov75e36472018-10-08 12:28:56 +020068 ? absl::optional<webrtc::BuiltInNetworkBehaviorConfig>(config)
Artem Titov4ff63cc2018-08-23 10:54:54 +020069 : absl::nullopt;
Erik Språng09708512018-03-14 15:16:50 +010070}
71} // namespace
zhihuang38ede132017-06-15 12:52:32 -070072
73Call* CallFactory::CreateCall(const Call::Config& config) {
Artem Titov75e36472018-10-08 12:28:56 +020074 absl::optional<webrtc::BuiltInNetworkBehaviorConfig> send_degradation_config =
75 ParseDegradationConfig(true);
76 absl::optional<webrtc::BuiltInNetworkBehaviorConfig>
Artem Titov4ff63cc2018-08-23 10:54:54 +020077 receive_degradation_config = ParseDegradationConfig(false);
Erik Språng09708512018-03-14 15:16:50 +010078
79 if (send_degradation_config || receive_degradation_config) {
80 return new DegradedCall(std::unique_ptr<Call>(Call::Create(config)),
Erik Språngc6488192019-08-06 15:54:23 +020081 send_degradation_config, receive_degradation_config,
82 config.task_queue_factory);
Erik Språng09708512018-03-14 15:16:50 +010083 }
84
zhihuang38ede132017-06-15 12:52:32 -070085 return Call::Create(config);
86}
87
88std::unique_ptr<CallFactoryInterface> CreateCallFactory() {
89 return std::unique_ptr<CallFactoryInterface>(new CallFactory());
90}
91
92} // namespace webrtc