blob: 4ab5b89d6d45c17b505edd64a7f72c67cf85b354 [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
Erik Språng09708512018-03-14 15:16:50 +010017#include "api/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
33rtc::Optional<webrtc::FakeNetworkPipe::Config> ParseDegradationConfig(
34 bool send) {
35 std::string exp_prefix = "WebRTCFakeNetwork";
36 if (send) {
37 exp_prefix += "Send";
38 } else {
39 exp_prefix += "Receive";
40 }
41
42 webrtc::FakeNetworkPipe::Config config;
43 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);
65 return configured ? rtc::Optional<webrtc::FakeNetworkPipe::Config>(config)
66 : rtc::nullopt;
67}
68} // namespace
zhihuang38ede132017-06-15 12:52:32 -070069
70Call* CallFactory::CreateCall(const Call::Config& config) {
Erik Språng09708512018-03-14 15:16:50 +010071 rtc::Optional<webrtc::FakeNetworkPipe::Config> send_degradation_config =
72 ParseDegradationConfig(true);
73 rtc::Optional<webrtc::FakeNetworkPipe::Config> receive_degradation_config =
74 ParseDegradationConfig(false);
75
76 if (send_degradation_config || receive_degradation_config) {
77 return new DegradedCall(std::unique_ptr<Call>(Call::Create(config)),
78 send_degradation_config,
79 receive_degradation_config);
80 }
81
zhihuang38ede132017-06-15 12:52:32 -070082 return Call::Create(config);
83}
84
85std::unique_ptr<CallFactoryInterface> CreateCallFactory() {
86 return std::unique_ptr<CallFactoryInterface>(new CallFactory());
87}
88
89} // namespace webrtc