blob: 380e80ce124028877e93c616692855473449814f [file] [log] [blame]
zhihuang38ede132017-06-15 19:52:321/*
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 17:11:0011#include "call/call_factory.h"
zhihuang38ede132017-06-15 19:52:3212
Yves Gerey3e707812018-11-28 15:47:4913#include <stdio.h>
Jonas Olssona4d87372019-07-05 17:08:3314
zhihuang38ede132017-06-15 19:52:3215#include <memory>
Erik Språng09708512018-03-14 14:16:5016#include <string>
Vojin Ilic504fc192021-05-31 12:02:2817#include <utility>
Erik Språngb5cba85c2022-02-08 11:35:4618#include <vector>
zhihuang38ede132017-06-15 19:52:3219
Danil Chapovalov80b7c6b2022-06-20 17:59:1120#include "absl/memory/memory.h"
Danil Chapovalovb9b146c2018-06-15 10:28:0721#include "absl/types/optional.h"
Yves Gerey3e707812018-11-28 15:47:4922#include "api/test/simulated_network.h"
Erik Språngb5cba85c2022-02-08 11:35:4623#include "api/units/time_delta.h"
Niels Möller8366e172018-02-14 11:20:1324#include "call/call.h"
Erik Språng09708512018-03-14 14:16:5025#include "call/degraded_call.h"
Vojin Ilic504fc192021-05-31 12:02:2826#include "call/rtp_transport_config.h"
Yves Gerey3e707812018-11-28 15:47:4927#include "rtc_base/checks.h"
Erik Språngb5cba85c2022-02-08 11:35:4628#include "rtc_base/experiments/field_trial_list.h"
29#include "rtc_base/experiments/field_trial_parser.h"
Niels Möller8366e172018-02-14 11:20:1330
zhihuang38ede132017-06-15 19:52:3231namespace webrtc {
Erik Språng09708512018-03-14 14:16:5032namespace {
Erik Språngb5cba85c2022-02-08 11:35:4633using TimeScopedNetworkConfig = DegradedCall::TimeScopedNetworkConfig;
34
Erik Språngb5cba85c2022-02-08 11:35:4635std::vector<TimeScopedNetworkConfig> GetNetworkConfigs(
Jonas Orelande62c2f22022-03-29 09:04:4836 const FieldTrialsView& trials,
Erik Språngb5cba85c2022-02-08 11:35:4637 bool send) {
38 FieldTrialStructList<TimeScopedNetworkConfig> trials_list(
39 {FieldTrialStructMember("queue_length_packets",
40 [](TimeScopedNetworkConfig* p) {
41 // FieldTrialParser does not natively support
42 // size_t type, so use this ugly cast as
43 // workaround.
44 return reinterpret_cast<unsigned*>(
45 &p->queue_length_packets);
46 }),
47 FieldTrialStructMember(
48 "queue_delay_ms",
49 [](TimeScopedNetworkConfig* p) { return &p->queue_delay_ms; }),
50 FieldTrialStructMember("delay_standard_deviation_ms",
51 [](TimeScopedNetworkConfig* p) {
52 return &p->delay_standard_deviation_ms;
53 }),
54 FieldTrialStructMember(
55 "link_capacity_kbps",
56 [](TimeScopedNetworkConfig* p) { return &p->link_capacity_kbps; }),
57 FieldTrialStructMember(
58 "loss_percent",
59 [](TimeScopedNetworkConfig* p) { return &p->loss_percent; }),
60 FieldTrialStructMember(
61 "allow_reordering",
62 [](TimeScopedNetworkConfig* p) { return &p->allow_reordering; }),
63 FieldTrialStructMember("avg_burst_loss_length",
64 [](TimeScopedNetworkConfig* p) {
65 return &p->avg_burst_loss_length;
66 }),
67 FieldTrialStructMember(
68 "packet_overhead",
69 [](TimeScopedNetworkConfig* p) { return &p->packet_overhead; }),
Erik Språngb5cba85c2022-02-08 11:35:4670 FieldTrialStructMember(
71 "duration",
72 [](TimeScopedNetworkConfig* p) { return &p->duration; })},
73 {});
74 ParseFieldTrial({&trials_list},
75 trials.Lookup(send ? "WebRTC-FakeNetworkSendConfig"
76 : "WebRTC-FakeNetworkReceiveConfig"));
Erik Språng16ddaa72022-07-26 12:49:3177 return trials_list.Get();
Erik Språngb5cba85c2022-02-08 11:35:4678}
79
Erik Språng09708512018-03-14 14:16:5080} // namespace
zhihuang38ede132017-06-15 19:52:3281
Tommi25c77c12020-05-25 15:44:5582CallFactory::CallFactory() {
83 call_thread_.Detach();
84}
85
zhihuang38ede132017-06-15 19:52:3286Call* CallFactory::CreateCall(const Call::Config& config) {
Tommi25c77c12020-05-25 15:44:5587 RTC_DCHECK_RUN_ON(&call_thread_);
Erik Språngb5cba85c2022-02-08 11:35:4688 RTC_DCHECK(config.trials);
89
90 std::vector<DegradedCall::TimeScopedNetworkConfig> send_degradation_configs =
91 GetNetworkConfigs(*config.trials, /*send=*/true);
92 std::vector<DegradedCall::TimeScopedNetworkConfig>
93 receive_degradation_configs =
94 GetNetworkConfigs(*config.trials, /*send=*/false);
Erik Språng09708512018-03-14 14:16:5095
Vojin Ilic504fc192021-05-31 12:02:2896 RtpTransportConfig transportConfig = config.ExtractTransportConfig();
97
Danil Chapovalov80b7c6b2022-06-20 17:59:1198 Call* call =
99 Call::Create(config, Clock::GetRealTimeClock(),
100 config.rtp_transport_controller_send_factory->Create(
101 transportConfig, Clock::GetRealTimeClock()));
102
Erik Språngb5cba85c2022-02-08 11:35:46103 if (!send_degradation_configs.empty() ||
104 !receive_degradation_configs.empty()) {
Danil Chapovalov80b7c6b2022-06-20 17:59:11105 return new DegradedCall(absl::WrapUnique(call), send_degradation_configs,
106 receive_degradation_configs);
Erik Språng09708512018-03-14 14:16:50107 }
108
Danil Chapovalov80b7c6b2022-06-20 17:59:11109 return call;
zhihuang38ede132017-06-15 19:52:32110}
111
112std::unique_ptr<CallFactoryInterface> CreateCallFactory() {
113 return std::unique_ptr<CallFactoryInterface>(new CallFactory());
114}
115
116} // namespace webrtc