xref: /aosp_15_r20/external/webrtc/test/scenario/call_client.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright 2018 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker #include "test/scenario/call_client.h"
11*d9f75844SAndroid Build Coastguard Worker 
12*d9f75844SAndroid Build Coastguard Worker #include <iostream>
13*d9f75844SAndroid Build Coastguard Worker #include <memory>
14*d9f75844SAndroid Build Coastguard Worker #include <utility>
15*d9f75844SAndroid Build Coastguard Worker 
16*d9f75844SAndroid Build Coastguard Worker #include "api/rtc_event_log/rtc_event_log.h"
17*d9f75844SAndroid Build Coastguard Worker #include "api/rtc_event_log/rtc_event_log_factory.h"
18*d9f75844SAndroid Build Coastguard Worker #include "api/transport/network_types.h"
19*d9f75844SAndroid Build Coastguard Worker #include "call/call.h"
20*d9f75844SAndroid Build Coastguard Worker #include "call/rtp_transport_controller_send_factory.h"
21*d9f75844SAndroid Build Coastguard Worker #include "modules/audio_mixer/audio_mixer_impl.h"
22*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtp_util.h"
23*d9f75844SAndroid Build Coastguard Worker 
24*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
25*d9f75844SAndroid Build Coastguard Worker namespace test {
26*d9f75844SAndroid Build Coastguard Worker namespace {
27*d9f75844SAndroid Build Coastguard Worker static constexpr size_t kNumSsrcs = 6;
28*d9f75844SAndroid Build Coastguard Worker const uint32_t kSendRtxSsrcs[kNumSsrcs] = {0xBADCAFD, 0xBADCAFE, 0xBADCAFF,
29*d9f75844SAndroid Build Coastguard Worker                                            0xBADCB00, 0xBADCB01, 0xBADCB02};
30*d9f75844SAndroid Build Coastguard Worker const uint32_t kVideoSendSsrcs[kNumSsrcs] = {0xC0FFED, 0xC0FFEE, 0xC0FFEF,
31*d9f75844SAndroid Build Coastguard Worker                                              0xC0FFF0, 0xC0FFF1, 0xC0FFF2};
32*d9f75844SAndroid Build Coastguard Worker const uint32_t kVideoRecvLocalSsrcs[kNumSsrcs] = {0xDAB001, 0xDAB002, 0xDAB003,
33*d9f75844SAndroid Build Coastguard Worker                                                   0xDAB004, 0xDAB005, 0xDAB006};
34*d9f75844SAndroid Build Coastguard Worker const uint32_t kAudioSendSsrc = 0xDEADBEEF;
35*d9f75844SAndroid Build Coastguard Worker const uint32_t kReceiverLocalAudioSsrc = 0x1234567;
36*d9f75844SAndroid Build Coastguard Worker 
37*d9f75844SAndroid Build Coastguard Worker constexpr int kEventLogOutputIntervalMs = 5000;
38*d9f75844SAndroid Build Coastguard Worker 
InitAudio(TimeController * time_controller)39*d9f75844SAndroid Build Coastguard Worker CallClientFakeAudio InitAudio(TimeController* time_controller) {
40*d9f75844SAndroid Build Coastguard Worker   CallClientFakeAudio setup;
41*d9f75844SAndroid Build Coastguard Worker   auto capturer = TestAudioDeviceModule::CreatePulsedNoiseCapturer(256, 48000);
42*d9f75844SAndroid Build Coastguard Worker   auto renderer = TestAudioDeviceModule::CreateDiscardRenderer(48000);
43*d9f75844SAndroid Build Coastguard Worker   setup.fake_audio_device = TestAudioDeviceModule::Create(
44*d9f75844SAndroid Build Coastguard Worker       time_controller->GetTaskQueueFactory(), std::move(capturer),
45*d9f75844SAndroid Build Coastguard Worker       std::move(renderer), 1.f);
46*d9f75844SAndroid Build Coastguard Worker   setup.apm = AudioProcessingBuilder().Create();
47*d9f75844SAndroid Build Coastguard Worker   setup.fake_audio_device->Init();
48*d9f75844SAndroid Build Coastguard Worker   AudioState::Config audio_state_config;
49*d9f75844SAndroid Build Coastguard Worker   audio_state_config.audio_mixer = AudioMixerImpl::Create();
50*d9f75844SAndroid Build Coastguard Worker   audio_state_config.audio_processing = setup.apm;
51*d9f75844SAndroid Build Coastguard Worker   audio_state_config.audio_device_module = setup.fake_audio_device;
52*d9f75844SAndroid Build Coastguard Worker   setup.audio_state = AudioState::Create(audio_state_config);
53*d9f75844SAndroid Build Coastguard Worker   setup.fake_audio_device->RegisterAudioCallback(
54*d9f75844SAndroid Build Coastguard Worker       setup.audio_state->audio_transport());
55*d9f75844SAndroid Build Coastguard Worker   return setup;
56*d9f75844SAndroid Build Coastguard Worker }
57*d9f75844SAndroid Build Coastguard Worker 
CreateCall(TimeController * time_controller,RtcEventLog * event_log,CallClientConfig config,LoggingNetworkControllerFactory * network_controller_factory,rtc::scoped_refptr<AudioState> audio_state)58*d9f75844SAndroid Build Coastguard Worker Call* CreateCall(TimeController* time_controller,
59*d9f75844SAndroid Build Coastguard Worker                  RtcEventLog* event_log,
60*d9f75844SAndroid Build Coastguard Worker                  CallClientConfig config,
61*d9f75844SAndroid Build Coastguard Worker                  LoggingNetworkControllerFactory* network_controller_factory,
62*d9f75844SAndroid Build Coastguard Worker                  rtc::scoped_refptr<AudioState> audio_state) {
63*d9f75844SAndroid Build Coastguard Worker   CallConfig call_config(event_log);
64*d9f75844SAndroid Build Coastguard Worker   call_config.bitrate_config.max_bitrate_bps =
65*d9f75844SAndroid Build Coastguard Worker       config.transport.rates.max_rate.bps_or(-1);
66*d9f75844SAndroid Build Coastguard Worker   call_config.bitrate_config.min_bitrate_bps =
67*d9f75844SAndroid Build Coastguard Worker       config.transport.rates.min_rate.bps();
68*d9f75844SAndroid Build Coastguard Worker   call_config.bitrate_config.start_bitrate_bps =
69*d9f75844SAndroid Build Coastguard Worker       config.transport.rates.start_rate.bps();
70*d9f75844SAndroid Build Coastguard Worker   call_config.task_queue_factory = time_controller->GetTaskQueueFactory();
71*d9f75844SAndroid Build Coastguard Worker   call_config.network_controller_factory = network_controller_factory;
72*d9f75844SAndroid Build Coastguard Worker   call_config.audio_state = audio_state;
73*d9f75844SAndroid Build Coastguard Worker   call_config.trials = config.field_trials;
74*d9f75844SAndroid Build Coastguard Worker   Clock* clock = time_controller->GetClock();
75*d9f75844SAndroid Build Coastguard Worker   return Call::Create(call_config, clock,
76*d9f75844SAndroid Build Coastguard Worker                       RtpTransportControllerSendFactory().Create(
77*d9f75844SAndroid Build Coastguard Worker                           call_config.ExtractTransportConfig(), clock));
78*d9f75844SAndroid Build Coastguard Worker }
79*d9f75844SAndroid Build Coastguard Worker 
CreateEventLog(TaskQueueFactory * task_queue_factory,LogWriterFactoryInterface * log_writer_factory)80*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<RtcEventLog> CreateEventLog(
81*d9f75844SAndroid Build Coastguard Worker     TaskQueueFactory* task_queue_factory,
82*d9f75844SAndroid Build Coastguard Worker     LogWriterFactoryInterface* log_writer_factory) {
83*d9f75844SAndroid Build Coastguard Worker   if (!log_writer_factory) {
84*d9f75844SAndroid Build Coastguard Worker     return std::make_unique<RtcEventLogNull>();
85*d9f75844SAndroid Build Coastguard Worker   }
86*d9f75844SAndroid Build Coastguard Worker   auto event_log = RtcEventLogFactory(task_queue_factory)
87*d9f75844SAndroid Build Coastguard Worker                        .CreateRtcEventLog(RtcEventLog::EncodingType::NewFormat);
88*d9f75844SAndroid Build Coastguard Worker   bool success = event_log->StartLogging(log_writer_factory->Create(".rtc.dat"),
89*d9f75844SAndroid Build Coastguard Worker                                          kEventLogOutputIntervalMs);
90*d9f75844SAndroid Build Coastguard Worker   RTC_CHECK(success);
91*d9f75844SAndroid Build Coastguard Worker   return event_log;
92*d9f75844SAndroid Build Coastguard Worker }
93*d9f75844SAndroid Build Coastguard Worker }  // namespace
NetworkControleUpdateCache(std::unique_ptr<NetworkControllerInterface> controller)94*d9f75844SAndroid Build Coastguard Worker NetworkControleUpdateCache::NetworkControleUpdateCache(
95*d9f75844SAndroid Build Coastguard Worker     std::unique_ptr<NetworkControllerInterface> controller)
96*d9f75844SAndroid Build Coastguard Worker     : controller_(std::move(controller)) {}
OnNetworkAvailability(NetworkAvailability msg)97*d9f75844SAndroid Build Coastguard Worker NetworkControlUpdate NetworkControleUpdateCache::OnNetworkAvailability(
98*d9f75844SAndroid Build Coastguard Worker     NetworkAvailability msg) {
99*d9f75844SAndroid Build Coastguard Worker   return Update(controller_->OnNetworkAvailability(msg));
100*d9f75844SAndroid Build Coastguard Worker }
OnNetworkRouteChange(NetworkRouteChange msg)101*d9f75844SAndroid Build Coastguard Worker NetworkControlUpdate NetworkControleUpdateCache::OnNetworkRouteChange(
102*d9f75844SAndroid Build Coastguard Worker     NetworkRouteChange msg) {
103*d9f75844SAndroid Build Coastguard Worker   return Update(controller_->OnNetworkRouteChange(msg));
104*d9f75844SAndroid Build Coastguard Worker }
OnProcessInterval(ProcessInterval msg)105*d9f75844SAndroid Build Coastguard Worker NetworkControlUpdate NetworkControleUpdateCache::OnProcessInterval(
106*d9f75844SAndroid Build Coastguard Worker     ProcessInterval msg) {
107*d9f75844SAndroid Build Coastguard Worker   return Update(controller_->OnProcessInterval(msg));
108*d9f75844SAndroid Build Coastguard Worker }
OnRemoteBitrateReport(RemoteBitrateReport msg)109*d9f75844SAndroid Build Coastguard Worker NetworkControlUpdate NetworkControleUpdateCache::OnRemoteBitrateReport(
110*d9f75844SAndroid Build Coastguard Worker     RemoteBitrateReport msg) {
111*d9f75844SAndroid Build Coastguard Worker   return Update(controller_->OnRemoteBitrateReport(msg));
112*d9f75844SAndroid Build Coastguard Worker }
OnRoundTripTimeUpdate(RoundTripTimeUpdate msg)113*d9f75844SAndroid Build Coastguard Worker NetworkControlUpdate NetworkControleUpdateCache::OnRoundTripTimeUpdate(
114*d9f75844SAndroid Build Coastguard Worker     RoundTripTimeUpdate msg) {
115*d9f75844SAndroid Build Coastguard Worker   return Update(controller_->OnRoundTripTimeUpdate(msg));
116*d9f75844SAndroid Build Coastguard Worker }
OnSentPacket(SentPacket msg)117*d9f75844SAndroid Build Coastguard Worker NetworkControlUpdate NetworkControleUpdateCache::OnSentPacket(SentPacket msg) {
118*d9f75844SAndroid Build Coastguard Worker   return Update(controller_->OnSentPacket(msg));
119*d9f75844SAndroid Build Coastguard Worker }
OnReceivedPacket(ReceivedPacket msg)120*d9f75844SAndroid Build Coastguard Worker NetworkControlUpdate NetworkControleUpdateCache::OnReceivedPacket(
121*d9f75844SAndroid Build Coastguard Worker     ReceivedPacket msg) {
122*d9f75844SAndroid Build Coastguard Worker   return Update(controller_->OnReceivedPacket(msg));
123*d9f75844SAndroid Build Coastguard Worker }
OnStreamsConfig(StreamsConfig msg)124*d9f75844SAndroid Build Coastguard Worker NetworkControlUpdate NetworkControleUpdateCache::OnStreamsConfig(
125*d9f75844SAndroid Build Coastguard Worker     StreamsConfig msg) {
126*d9f75844SAndroid Build Coastguard Worker   return Update(controller_->OnStreamsConfig(msg));
127*d9f75844SAndroid Build Coastguard Worker }
OnTargetRateConstraints(TargetRateConstraints msg)128*d9f75844SAndroid Build Coastguard Worker NetworkControlUpdate NetworkControleUpdateCache::OnTargetRateConstraints(
129*d9f75844SAndroid Build Coastguard Worker     TargetRateConstraints msg) {
130*d9f75844SAndroid Build Coastguard Worker   return Update(controller_->OnTargetRateConstraints(msg));
131*d9f75844SAndroid Build Coastguard Worker }
OnTransportLossReport(TransportLossReport msg)132*d9f75844SAndroid Build Coastguard Worker NetworkControlUpdate NetworkControleUpdateCache::OnTransportLossReport(
133*d9f75844SAndroid Build Coastguard Worker     TransportLossReport msg) {
134*d9f75844SAndroid Build Coastguard Worker   return Update(controller_->OnTransportLossReport(msg));
135*d9f75844SAndroid Build Coastguard Worker }
OnTransportPacketsFeedback(TransportPacketsFeedback msg)136*d9f75844SAndroid Build Coastguard Worker NetworkControlUpdate NetworkControleUpdateCache::OnTransportPacketsFeedback(
137*d9f75844SAndroid Build Coastguard Worker     TransportPacketsFeedback msg) {
138*d9f75844SAndroid Build Coastguard Worker   return Update(controller_->OnTransportPacketsFeedback(msg));
139*d9f75844SAndroid Build Coastguard Worker }
OnNetworkStateEstimate(NetworkStateEstimate msg)140*d9f75844SAndroid Build Coastguard Worker NetworkControlUpdate NetworkControleUpdateCache::OnNetworkStateEstimate(
141*d9f75844SAndroid Build Coastguard Worker     NetworkStateEstimate msg) {
142*d9f75844SAndroid Build Coastguard Worker   return Update(controller_->OnNetworkStateEstimate(msg));
143*d9f75844SAndroid Build Coastguard Worker }
144*d9f75844SAndroid Build Coastguard Worker 
update_state() const145*d9f75844SAndroid Build Coastguard Worker NetworkControlUpdate NetworkControleUpdateCache::update_state() const {
146*d9f75844SAndroid Build Coastguard Worker   return update_state_;
147*d9f75844SAndroid Build Coastguard Worker }
Update(NetworkControlUpdate update)148*d9f75844SAndroid Build Coastguard Worker NetworkControlUpdate NetworkControleUpdateCache::Update(
149*d9f75844SAndroid Build Coastguard Worker     NetworkControlUpdate update) {
150*d9f75844SAndroid Build Coastguard Worker   if (update.target_rate)
151*d9f75844SAndroid Build Coastguard Worker     update_state_.target_rate = update.target_rate;
152*d9f75844SAndroid Build Coastguard Worker   if (update.pacer_config)
153*d9f75844SAndroid Build Coastguard Worker     update_state_.pacer_config = update.pacer_config;
154*d9f75844SAndroid Build Coastguard Worker   if (update.congestion_window)
155*d9f75844SAndroid Build Coastguard Worker     update_state_.congestion_window = update.congestion_window;
156*d9f75844SAndroid Build Coastguard Worker   if (!update.probe_cluster_configs.empty())
157*d9f75844SAndroid Build Coastguard Worker     update_state_.probe_cluster_configs = update.probe_cluster_configs;
158*d9f75844SAndroid Build Coastguard Worker   return update;
159*d9f75844SAndroid Build Coastguard Worker }
160*d9f75844SAndroid Build Coastguard Worker 
LoggingNetworkControllerFactory(LogWriterFactoryInterface * log_writer_factory,TransportControllerConfig config)161*d9f75844SAndroid Build Coastguard Worker LoggingNetworkControllerFactory::LoggingNetworkControllerFactory(
162*d9f75844SAndroid Build Coastguard Worker     LogWriterFactoryInterface* log_writer_factory,
163*d9f75844SAndroid Build Coastguard Worker     TransportControllerConfig config) {
164*d9f75844SAndroid Build Coastguard Worker   if (config.cc_factory) {
165*d9f75844SAndroid Build Coastguard Worker     cc_factory_ = config.cc_factory;
166*d9f75844SAndroid Build Coastguard Worker     if (log_writer_factory)
167*d9f75844SAndroid Build Coastguard Worker       RTC_LOG(LS_WARNING)
168*d9f75844SAndroid Build Coastguard Worker           << "Can't log controller state for injected network controllers";
169*d9f75844SAndroid Build Coastguard Worker   } else {
170*d9f75844SAndroid Build Coastguard Worker     if (log_writer_factory) {
171*d9f75844SAndroid Build Coastguard Worker       goog_cc_factory_.AttachWriter(
172*d9f75844SAndroid Build Coastguard Worker           log_writer_factory->Create(".cc_state.txt"));
173*d9f75844SAndroid Build Coastguard Worker       print_cc_state_ = true;
174*d9f75844SAndroid Build Coastguard Worker     }
175*d9f75844SAndroid Build Coastguard Worker     cc_factory_ = &goog_cc_factory_;
176*d9f75844SAndroid Build Coastguard Worker   }
177*d9f75844SAndroid Build Coastguard Worker }
178*d9f75844SAndroid Build Coastguard Worker 
~LoggingNetworkControllerFactory()179*d9f75844SAndroid Build Coastguard Worker LoggingNetworkControllerFactory::~LoggingNetworkControllerFactory() {}
180*d9f75844SAndroid Build Coastguard Worker 
LogCongestionControllerStats(Timestamp at_time)181*d9f75844SAndroid Build Coastguard Worker void LoggingNetworkControllerFactory::LogCongestionControllerStats(
182*d9f75844SAndroid Build Coastguard Worker     Timestamp at_time) {
183*d9f75844SAndroid Build Coastguard Worker   if (print_cc_state_)
184*d9f75844SAndroid Build Coastguard Worker     goog_cc_factory_.PrintState(at_time);
185*d9f75844SAndroid Build Coastguard Worker }
186*d9f75844SAndroid Build Coastguard Worker 
GetUpdate() const187*d9f75844SAndroid Build Coastguard Worker NetworkControlUpdate LoggingNetworkControllerFactory::GetUpdate() const {
188*d9f75844SAndroid Build Coastguard Worker   if (last_controller_)
189*d9f75844SAndroid Build Coastguard Worker     return last_controller_->update_state();
190*d9f75844SAndroid Build Coastguard Worker   return NetworkControlUpdate();
191*d9f75844SAndroid Build Coastguard Worker }
192*d9f75844SAndroid Build Coastguard Worker 
193*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<NetworkControllerInterface>
Create(NetworkControllerConfig config)194*d9f75844SAndroid Build Coastguard Worker LoggingNetworkControllerFactory::Create(NetworkControllerConfig config) {
195*d9f75844SAndroid Build Coastguard Worker   auto controller =
196*d9f75844SAndroid Build Coastguard Worker       std::make_unique<NetworkControleUpdateCache>(cc_factory_->Create(config));
197*d9f75844SAndroid Build Coastguard Worker   last_controller_ = controller.get();
198*d9f75844SAndroid Build Coastguard Worker   return controller;
199*d9f75844SAndroid Build Coastguard Worker }
200*d9f75844SAndroid Build Coastguard Worker 
GetProcessInterval() const201*d9f75844SAndroid Build Coastguard Worker TimeDelta LoggingNetworkControllerFactory::GetProcessInterval() const {
202*d9f75844SAndroid Build Coastguard Worker   return cc_factory_->GetProcessInterval();
203*d9f75844SAndroid Build Coastguard Worker }
204*d9f75844SAndroid Build Coastguard Worker 
SetRemoteBitrateEstimate(RemoteBitrateReport msg)205*d9f75844SAndroid Build Coastguard Worker void LoggingNetworkControllerFactory::SetRemoteBitrateEstimate(
206*d9f75844SAndroid Build Coastguard Worker     RemoteBitrateReport msg) {
207*d9f75844SAndroid Build Coastguard Worker   if (last_controller_)
208*d9f75844SAndroid Build Coastguard Worker     last_controller_->OnRemoteBitrateReport(msg);
209*d9f75844SAndroid Build Coastguard Worker }
210*d9f75844SAndroid Build Coastguard Worker 
CallClient(TimeController * time_controller,std::unique_ptr<LogWriterFactoryInterface> log_writer_factory,CallClientConfig config)211*d9f75844SAndroid Build Coastguard Worker CallClient::CallClient(
212*d9f75844SAndroid Build Coastguard Worker     TimeController* time_controller,
213*d9f75844SAndroid Build Coastguard Worker     std::unique_ptr<LogWriterFactoryInterface> log_writer_factory,
214*d9f75844SAndroid Build Coastguard Worker     CallClientConfig config)
215*d9f75844SAndroid Build Coastguard Worker     : time_controller_(time_controller),
216*d9f75844SAndroid Build Coastguard Worker       clock_(time_controller->GetClock()),
217*d9f75844SAndroid Build Coastguard Worker       log_writer_factory_(std::move(log_writer_factory)),
218*d9f75844SAndroid Build Coastguard Worker       network_controller_factory_(log_writer_factory_.get(), config.transport),
219*d9f75844SAndroid Build Coastguard Worker       task_queue_(time_controller->GetTaskQueueFactory()->CreateTaskQueue(
220*d9f75844SAndroid Build Coastguard Worker           "CallClient",
221*d9f75844SAndroid Build Coastguard Worker           TaskQueueFactory::Priority::NORMAL)) {
222*d9f75844SAndroid Build Coastguard Worker   config.field_trials = &field_trials_;
223*d9f75844SAndroid Build Coastguard Worker   SendTask([this, config] {
224*d9f75844SAndroid Build Coastguard Worker     event_log_ = CreateEventLog(time_controller_->GetTaskQueueFactory(),
225*d9f75844SAndroid Build Coastguard Worker                                 log_writer_factory_.get());
226*d9f75844SAndroid Build Coastguard Worker     fake_audio_setup_ = InitAudio(time_controller_);
227*d9f75844SAndroid Build Coastguard Worker 
228*d9f75844SAndroid Build Coastguard Worker     call_.reset(CreateCall(time_controller_, event_log_.get(), config,
229*d9f75844SAndroid Build Coastguard Worker                            &network_controller_factory_,
230*d9f75844SAndroid Build Coastguard Worker                            fake_audio_setup_.audio_state));
231*d9f75844SAndroid Build Coastguard Worker     transport_ = std::make_unique<NetworkNodeTransport>(clock_, call_.get());
232*d9f75844SAndroid Build Coastguard Worker   });
233*d9f75844SAndroid Build Coastguard Worker }
234*d9f75844SAndroid Build Coastguard Worker 
~CallClient()235*d9f75844SAndroid Build Coastguard Worker CallClient::~CallClient() {
236*d9f75844SAndroid Build Coastguard Worker   SendTask([&] {
237*d9f75844SAndroid Build Coastguard Worker     call_.reset();
238*d9f75844SAndroid Build Coastguard Worker     fake_audio_setup_ = {};
239*d9f75844SAndroid Build Coastguard Worker     rtc::Event done;
240*d9f75844SAndroid Build Coastguard Worker     event_log_->StopLogging([&done] { done.Set(); });
241*d9f75844SAndroid Build Coastguard Worker     done.Wait(rtc::Event::kForever);
242*d9f75844SAndroid Build Coastguard Worker     event_log_.reset();
243*d9f75844SAndroid Build Coastguard Worker   });
244*d9f75844SAndroid Build Coastguard Worker }
245*d9f75844SAndroid Build Coastguard Worker 
StatsPrinter()246*d9f75844SAndroid Build Coastguard Worker ColumnPrinter CallClient::StatsPrinter() {
247*d9f75844SAndroid Build Coastguard Worker   return ColumnPrinter::Lambda(
248*d9f75844SAndroid Build Coastguard Worker       "pacer_delay call_send_bw",
249*d9f75844SAndroid Build Coastguard Worker       [this](rtc::SimpleStringBuilder& sb) {
250*d9f75844SAndroid Build Coastguard Worker         Call::Stats call_stats = call_->GetStats();
251*d9f75844SAndroid Build Coastguard Worker         sb.AppendFormat("%.3lf %.0lf", call_stats.pacer_delay_ms / 1000.0,
252*d9f75844SAndroid Build Coastguard Worker                         call_stats.send_bandwidth_bps / 8.0);
253*d9f75844SAndroid Build Coastguard Worker       },
254*d9f75844SAndroid Build Coastguard Worker       64);
255*d9f75844SAndroid Build Coastguard Worker }
256*d9f75844SAndroid Build Coastguard Worker 
GetStats()257*d9f75844SAndroid Build Coastguard Worker Call::Stats CallClient::GetStats() {
258*d9f75844SAndroid Build Coastguard Worker   // This call needs to be made on the thread that `call_` was constructed on.
259*d9f75844SAndroid Build Coastguard Worker   Call::Stats stats;
260*d9f75844SAndroid Build Coastguard Worker   SendTask([this, &stats] { stats = call_->GetStats(); });
261*d9f75844SAndroid Build Coastguard Worker   return stats;
262*d9f75844SAndroid Build Coastguard Worker }
263*d9f75844SAndroid Build Coastguard Worker 
target_rate() const264*d9f75844SAndroid Build Coastguard Worker DataRate CallClient::target_rate() const {
265*d9f75844SAndroid Build Coastguard Worker   return network_controller_factory_.GetUpdate().target_rate->target_rate;
266*d9f75844SAndroid Build Coastguard Worker }
267*d9f75844SAndroid Build Coastguard Worker 
stable_target_rate() const268*d9f75844SAndroid Build Coastguard Worker DataRate CallClient::stable_target_rate() const {
269*d9f75844SAndroid Build Coastguard Worker   return network_controller_factory_.GetUpdate()
270*d9f75844SAndroid Build Coastguard Worker       .target_rate->stable_target_rate;
271*d9f75844SAndroid Build Coastguard Worker }
272*d9f75844SAndroid Build Coastguard Worker 
padding_rate() const273*d9f75844SAndroid Build Coastguard Worker DataRate CallClient::padding_rate() const {
274*d9f75844SAndroid Build Coastguard Worker   return network_controller_factory_.GetUpdate().pacer_config->pad_rate();
275*d9f75844SAndroid Build Coastguard Worker }
276*d9f75844SAndroid Build Coastguard Worker 
SetRemoteBitrate(DataRate bitrate)277*d9f75844SAndroid Build Coastguard Worker void CallClient::SetRemoteBitrate(DataRate bitrate) {
278*d9f75844SAndroid Build Coastguard Worker   RemoteBitrateReport msg;
279*d9f75844SAndroid Build Coastguard Worker   msg.bandwidth = bitrate;
280*d9f75844SAndroid Build Coastguard Worker   msg.receive_time = clock_->CurrentTime();
281*d9f75844SAndroid Build Coastguard Worker   network_controller_factory_.SetRemoteBitrateEstimate(msg);
282*d9f75844SAndroid Build Coastguard Worker }
283*d9f75844SAndroid Build Coastguard Worker 
UpdateBitrateConstraints(const BitrateConstraints & constraints)284*d9f75844SAndroid Build Coastguard Worker void CallClient::UpdateBitrateConstraints(
285*d9f75844SAndroid Build Coastguard Worker     const BitrateConstraints& constraints) {
286*d9f75844SAndroid Build Coastguard Worker   SendTask([this, &constraints]() {
287*d9f75844SAndroid Build Coastguard Worker     call_->GetTransportControllerSend()->SetSdpBitrateParameters(constraints);
288*d9f75844SAndroid Build Coastguard Worker   });
289*d9f75844SAndroid Build Coastguard Worker }
290*d9f75844SAndroid Build Coastguard Worker 
OnPacketReceived(EmulatedIpPacket packet)291*d9f75844SAndroid Build Coastguard Worker void CallClient::OnPacketReceived(EmulatedIpPacket packet) {
292*d9f75844SAndroid Build Coastguard Worker   MediaType media_type = MediaType::ANY;
293*d9f75844SAndroid Build Coastguard Worker   if (IsRtpPacket(packet.data)) {
294*d9f75844SAndroid Build Coastguard Worker     media_type = ssrc_media_types_[ParseRtpSsrc(packet.data)];
295*d9f75844SAndroid Build Coastguard Worker   }
296*d9f75844SAndroid Build Coastguard Worker   task_queue_.PostTask(
297*d9f75844SAndroid Build Coastguard Worker       [call = call_.get(), media_type, packet = std::move(packet)]() mutable {
298*d9f75844SAndroid Build Coastguard Worker         call->Receiver()->DeliverPacket(media_type, packet.data,
299*d9f75844SAndroid Build Coastguard Worker                                         packet.arrival_time.us());
300*d9f75844SAndroid Build Coastguard Worker       });
301*d9f75844SAndroid Build Coastguard Worker }
302*d9f75844SAndroid Build Coastguard Worker 
GetLogWriter(std::string name)303*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<RtcEventLogOutput> CallClient::GetLogWriter(std::string name) {
304*d9f75844SAndroid Build Coastguard Worker   if (!log_writer_factory_ || name.empty())
305*d9f75844SAndroid Build Coastguard Worker     return nullptr;
306*d9f75844SAndroid Build Coastguard Worker   return log_writer_factory_->Create(name);
307*d9f75844SAndroid Build Coastguard Worker }
308*d9f75844SAndroid Build Coastguard Worker 
GetNextVideoSsrc()309*d9f75844SAndroid Build Coastguard Worker uint32_t CallClient::GetNextVideoSsrc() {
310*d9f75844SAndroid Build Coastguard Worker   RTC_CHECK_LT(next_video_ssrc_index_, kNumSsrcs);
311*d9f75844SAndroid Build Coastguard Worker   return kVideoSendSsrcs[next_video_ssrc_index_++];
312*d9f75844SAndroid Build Coastguard Worker }
313*d9f75844SAndroid Build Coastguard Worker 
GetNextVideoLocalSsrc()314*d9f75844SAndroid Build Coastguard Worker uint32_t CallClient::GetNextVideoLocalSsrc() {
315*d9f75844SAndroid Build Coastguard Worker   RTC_CHECK_LT(next_video_local_ssrc_index_, kNumSsrcs);
316*d9f75844SAndroid Build Coastguard Worker   return kVideoRecvLocalSsrcs[next_video_local_ssrc_index_++];
317*d9f75844SAndroid Build Coastguard Worker }
318*d9f75844SAndroid Build Coastguard Worker 
GetNextAudioSsrc()319*d9f75844SAndroid Build Coastguard Worker uint32_t CallClient::GetNextAudioSsrc() {
320*d9f75844SAndroid Build Coastguard Worker   RTC_CHECK_LT(next_audio_ssrc_index_, 1);
321*d9f75844SAndroid Build Coastguard Worker   next_audio_ssrc_index_++;
322*d9f75844SAndroid Build Coastguard Worker   return kAudioSendSsrc;
323*d9f75844SAndroid Build Coastguard Worker }
324*d9f75844SAndroid Build Coastguard Worker 
GetNextAudioLocalSsrc()325*d9f75844SAndroid Build Coastguard Worker uint32_t CallClient::GetNextAudioLocalSsrc() {
326*d9f75844SAndroid Build Coastguard Worker   RTC_CHECK_LT(next_audio_local_ssrc_index_, 1);
327*d9f75844SAndroid Build Coastguard Worker   next_audio_local_ssrc_index_++;
328*d9f75844SAndroid Build Coastguard Worker   return kReceiverLocalAudioSsrc;
329*d9f75844SAndroid Build Coastguard Worker }
330*d9f75844SAndroid Build Coastguard Worker 
GetNextRtxSsrc()331*d9f75844SAndroid Build Coastguard Worker uint32_t CallClient::GetNextRtxSsrc() {
332*d9f75844SAndroid Build Coastguard Worker   RTC_CHECK_LT(next_rtx_ssrc_index_, kNumSsrcs);
333*d9f75844SAndroid Build Coastguard Worker   return kSendRtxSsrcs[next_rtx_ssrc_index_++];
334*d9f75844SAndroid Build Coastguard Worker }
335*d9f75844SAndroid Build Coastguard Worker 
SendTask(std::function<void ()> task)336*d9f75844SAndroid Build Coastguard Worker void CallClient::SendTask(std::function<void()> task) {
337*d9f75844SAndroid Build Coastguard Worker   task_queue_.SendTask(std::move(task));
338*d9f75844SAndroid Build Coastguard Worker }
339*d9f75844SAndroid Build Coastguard Worker 
Bind(EmulatedEndpoint * endpoint)340*d9f75844SAndroid Build Coastguard Worker int16_t CallClient::Bind(EmulatedEndpoint* endpoint) {
341*d9f75844SAndroid Build Coastguard Worker   uint16_t port = endpoint->BindReceiver(0, this).value();
342*d9f75844SAndroid Build Coastguard Worker   endpoints_.push_back({endpoint, port});
343*d9f75844SAndroid Build Coastguard Worker   return port;
344*d9f75844SAndroid Build Coastguard Worker }
345*d9f75844SAndroid Build Coastguard Worker 
UnBind()346*d9f75844SAndroid Build Coastguard Worker void CallClient::UnBind() {
347*d9f75844SAndroid Build Coastguard Worker   for (auto ep_port : endpoints_)
348*d9f75844SAndroid Build Coastguard Worker     ep_port.first->UnbindReceiver(ep_port.second);
349*d9f75844SAndroid Build Coastguard Worker }
350*d9f75844SAndroid Build Coastguard Worker 
351*d9f75844SAndroid Build Coastguard Worker CallClientPair::~CallClientPair() = default;
352*d9f75844SAndroid Build Coastguard Worker 
353*d9f75844SAndroid Build Coastguard Worker }  // namespace test
354*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
355