blob: 18a5b9a5fa0d7e494c9f6b4fd541c70e3242fe14 [file] [log] [blame]
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001/*
2 * Copyright (c) 2014 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 */
brandtr841de6a2016-11-15 07:10:52 -080010
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "test/call_test.h"
brandtr841de6a2016-11-15 07:10:52 -080012
13#include <algorithm>
14
Karl Wiberg918f50c2018-07-05 11:40:33 +020015#include "absl/memory/memory.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020016#include "api/audio_codecs/builtin_audio_decoder_factory.h"
17#include "api/audio_codecs/builtin_audio_encoder_factory.h"
Niels Möller0a8f4352018-05-18 11:37:23 +020018#include "api/video_codecs/video_encoder_config.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020019#include "call/rtp_transport_controller_send.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020020#include "modules/audio_mixer/audio_mixer_impl.h"
Sebastian Jansson50eb4c42018-08-03 13:25:17 +020021#include "modules/congestion_controller/bbr/bbr_factory.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020022#include "rtc_base/checks.h"
23#include "rtc_base/event.h"
Sebastian Jansson50eb4c42018-08-03 13:25:17 +020024#include "rtc_base/experiments/congestion_controller_experiment.h"
Niels Möller4db138e2018-04-19 09:04:13 +020025#include "test/fake_encoder.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020026#include "test/testsupport/fileutils.h"
eladalon413ee9a2017-08-22 04:02:52 -070027
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000028namespace webrtc {
29namespace test {
30
Guo-wei Shieh2c370782015-04-08 13:00:10 -070031namespace {
32const int kVideoRotationRtpExtensionId = 4;
33}
34
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000035CallTest::CallTest()
pbos@webrtc.org2bb1bda2014-07-07 13:06:48 +000036 : clock_(Clock::GetRealTimeClock()),
Sebastian Jansson8e6602f2018-07-13 10:43:20 +020037 send_event_log_(RtcEventLog::CreateNull()),
38 recv_event_log_(RtcEventLog::CreateNull()),
sprangdb2a9fc2017-08-09 06:42:32 -070039 sender_call_transport_controller_(nullptr),
Stefan Holmer9fea80f2016-01-07 17:43:18 +010040 audio_send_config_(nullptr),
41 audio_send_stream_(nullptr),
Sebastian Jansson50eb4c42018-08-03 13:25:17 +020042 bbr_network_controller_factory_(new BbrNetworkControllerFactory()),
Niels Möller4db138e2018-04-19 09:04:13 +020043 fake_encoder_factory_([this]() {
Karl Wiberg918f50c2018-07-05 11:40:33 +020044 auto encoder = absl::make_unique<test::FakeEncoder>(clock_);
Niels Möller4db138e2018-04-19 09:04:13 +020045 encoder->SetMaxBitrate(fake_encoder_max_bitrate_);
46 return encoder;
47 }),
Stefan Holmer04cb7632016-01-14 20:34:30 +010048 num_video_streams_(1),
Stefan Holmer9fea80f2016-01-07 17:43:18 +010049 num_audio_streams_(0),
brandtr841de6a2016-11-15 07:10:52 -080050 num_flexfec_streams_(0),
Niels Möller2784a032018-03-28 14:16:04 +020051 audio_decoder_factory_(CreateBuiltinAudioDecoderFactory()),
52 audio_encoder_factory_(CreateBuiltinAudioEncoderFactory()),
Sebastian Jansson3bd2c792018-07-13 13:29:03 +020053 task_queue_("CallTestTaskQueue") {}
pbos@webrtc.org32452b22014-10-22 12:15:24 +000054
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000055CallTest::~CallTest() {
eladalon413ee9a2017-08-22 04:02:52 -070056 task_queue_.SendTask([this]() {
Fredrik Solenberg2a877972017-12-15 16:42:15 +010057 fake_send_audio_device_ = nullptr;
58 fake_recv_audio_device_ = nullptr;
Sebastian Jansson3bd2c792018-07-13 13:29:03 +020059 video_capturers_.clear();
eladalon413ee9a2017-08-22 04:02:52 -070060 });
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000061}
62
stefane74eef12016-01-08 06:47:13 -080063void CallTest::RunBaseTest(BaseTest* test) {
eladalon413ee9a2017-08-22 04:02:52 -070064 task_queue_.SendTask([this, test]() {
65 num_video_streams_ = test->GetNumVideoStreams();
66 num_audio_streams_ = test->GetNumAudioStreams();
67 num_flexfec_streams_ = test->GetNumFlexfecStreams();
68 RTC_DCHECK(num_video_streams_ > 0 || num_audio_streams_ > 0);
Sebastian Jansson72582242018-07-13 13:19:42 +020069 Call::Config send_config(send_event_log_.get());
70 test->ModifySenderCallConfig(&send_config);
Stefan Holmer9fea80f2016-01-07 17:43:18 +010071 if (num_audio_streams_ > 0) {
eladalon413ee9a2017-08-22 04:02:52 -070072 CreateFakeAudioDevices(test->CreateCapturer(), test->CreateRenderer());
73 test->OnFakeAudioDevicesCreated(fake_send_audio_device_.get(),
74 fake_recv_audio_device_.get());
Ivo Creusen62337e52018-01-09 14:17:33 +010075 apm_send_ = AudioProcessingBuilder().Create();
76 apm_recv_ = AudioProcessingBuilder().Create();
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010077 EXPECT_EQ(0, fake_send_audio_device_->Init());
78 EXPECT_EQ(0, fake_recv_audio_device_->Init());
Stefan Holmer9fea80f2016-01-07 17:43:18 +010079 AudioState::Config audio_state_config;
aleloi10111bc2016-11-17 06:48:48 -080080 audio_state_config.audio_mixer = AudioMixerImpl::Create();
eladalon413ee9a2017-08-22 04:02:52 -070081 audio_state_config.audio_processing = apm_send_;
Fredrik Solenberg2a877972017-12-15 16:42:15 +010082 audio_state_config.audio_device_module = fake_send_audio_device_;
eladalon413ee9a2017-08-22 04:02:52 -070083 send_config.audio_state = AudioState::Create(audio_state_config);
Fredrik Solenbergd3195342017-11-21 20:33:05 +010084 fake_send_audio_device_->RegisterAudioCallback(
85 send_config.audio_state->audio_transport());
Stefan Holmer9fea80f2016-01-07 17:43:18 +010086 }
eladalon413ee9a2017-08-22 04:02:52 -070087 CreateSenderCall(send_config);
88 if (sender_call_transport_controller_ != nullptr) {
89 test->OnRtpTransportControllerSendCreated(
90 sender_call_transport_controller_);
91 }
92 if (test->ShouldCreateReceivers()) {
Sebastian Jansson72582242018-07-13 13:19:42 +020093 Call::Config recv_config(recv_event_log_.get());
94 test->ModifyReceiverCallConfig(&recv_config);
eladalon413ee9a2017-08-22 04:02:52 -070095 if (num_audio_streams_ > 0) {
96 AudioState::Config audio_state_config;
eladalon413ee9a2017-08-22 04:02:52 -070097 audio_state_config.audio_mixer = AudioMixerImpl::Create();
98 audio_state_config.audio_processing = apm_recv_;
Fredrik Solenberg2a877972017-12-15 16:42:15 +010099 audio_state_config.audio_device_module = fake_recv_audio_device_;
eladalon413ee9a2017-08-22 04:02:52 -0700100 recv_config.audio_state = AudioState::Create(audio_state_config);
Fredrik Solenbergd3195342017-11-21 20:33:05 +0100101 fake_recv_audio_device_->RegisterAudioCallback(
Yves Gerey665174f2018-06-19 15:03:05 +0200102 recv_config.audio_state->audio_transport());
103 }
eladalon413ee9a2017-08-22 04:02:52 -0700104 CreateReceiverCall(recv_config);
105 }
106 test->OnCallsCreated(sender_call_.get(), receiver_call_.get());
107 receive_transport_.reset(test->CreateReceiveTransport(&task_queue_));
108 send_transport_.reset(
109 test->CreateSendTransport(&task_queue_, sender_call_.get()));
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000110
eladalon413ee9a2017-08-22 04:02:52 -0700111 if (test->ShouldCreateReceivers()) {
112 send_transport_->SetReceiver(receiver_call_->Receiver());
113 receive_transport_->SetReceiver(sender_call_->Receiver());
114 if (num_video_streams_ > 0)
115 receiver_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp);
116 if (num_audio_streams_ > 0)
117 receiver_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkUp);
118 } else {
119 // Sender-only call delivers to itself.
120 send_transport_->SetReceiver(sender_call_->Receiver());
121 receive_transport_->SetReceiver(nullptr);
122 }
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000123
eladalon413ee9a2017-08-22 04:02:52 -0700124 CreateSendConfig(num_video_streams_, num_audio_streams_,
125 num_flexfec_streams_, send_transport_.get());
126 if (test->ShouldCreateReceivers()) {
127 CreateMatchingReceiveConfigs(receive_transport_.get());
128 }
129 if (num_video_streams_ > 0) {
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200130 test->ModifyVideoConfigs(GetVideoSendConfig(), &video_receive_configs_,
131 GetVideoEncoderConfig());
eladalon413ee9a2017-08-22 04:02:52 -0700132 }
133 if (num_audio_streams_ > 0) {
134 test->ModifyAudioConfigs(&audio_send_config_, &audio_receive_configs_);
135 }
136 if (num_flexfec_streams_ > 0) {
137 test->ModifyFlexfecConfigs(&flexfec_receive_configs_);
138 }
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100139
eladalon413ee9a2017-08-22 04:02:52 -0700140 if (num_flexfec_streams_ > 0) {
141 CreateFlexfecStreams();
142 test->OnFlexfecStreamsCreated(flexfec_receive_streams_);
143 }
144 if (num_video_streams_ > 0) {
145 CreateVideoStreams();
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200146 test->OnVideoStreamsCreated(GetVideoSendStream(), video_receive_streams_);
eladalon413ee9a2017-08-22 04:02:52 -0700147 }
148 if (num_audio_streams_ > 0) {
149 CreateAudioStreams();
150 test->OnAudioStreamsCreated(audio_send_stream_, audio_receive_streams_);
151 }
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000152
eladalon413ee9a2017-08-22 04:02:52 -0700153 if (num_video_streams_ > 0) {
154 int width = kDefaultWidth;
155 int height = kDefaultHeight;
156 int frame_rate = kDefaultFramerate;
157 test->ModifyVideoCaptureStartResolution(&width, &height, &frame_rate);
158 CreateFrameGeneratorCapturer(frame_rate, width, height);
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200159 test->OnFrameGeneratorCapturerCreated(frame_generator_capturer_);
eladalon413ee9a2017-08-22 04:02:52 -0700160 }
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000161
eladalon413ee9a2017-08-22 04:02:52 -0700162 Start();
163 });
164
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000165 test->PerformTest();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000166
Fredrik Solenberg73276ad2017-09-14 14:46:47 +0200167 task_queue_.SendTask([this, test]() {
eladalon413ee9a2017-08-22 04:02:52 -0700168 Stop();
Fredrik Solenberg73276ad2017-09-14 14:46:47 +0200169 test->OnStreamsStopped();
eladalon413ee9a2017-08-22 04:02:52 -0700170 DestroyStreams();
171 send_transport_.reset();
172 receive_transport_.reset();
173 DestroyCalls();
eladalon413ee9a2017-08-22 04:02:52 -0700174 });
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000175}
176
Sebastian Jansson8e6602f2018-07-13 10:43:20 +0200177void CallTest::CreateCalls() {
178 CreateCalls(Call::Config(send_event_log_.get()),
179 Call::Config(recv_event_log_.get()));
180}
181
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000182void CallTest::CreateCalls(const Call::Config& sender_config,
183 const Call::Config& receiver_config) {
184 CreateSenderCall(sender_config);
185 CreateReceiverCall(receiver_config);
186}
187
Sebastian Jansson8e6602f2018-07-13 10:43:20 +0200188void CallTest::CreateSenderCall() {
189 CreateSenderCall(Call::Config(send_event_log_.get()));
190}
191
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000192void CallTest::CreateSenderCall(const Call::Config& config) {
Sebastian Jansson50eb4c42018-08-03 13:25:17 +0200193 NetworkControllerFactoryInterface* injected_factory =
194 config.network_controller_factory;
195 if (!injected_factory) {
196 if (CongestionControllerExperiment::BbrControllerEnabled()) {
197 RTC_LOG(LS_INFO) << "Using BBR network controller factory";
198 injected_factory = bbr_network_controller_factory_.get();
199 } else {
200 RTC_LOG(LS_INFO) << "Using default network controller factory";
201 }
202 }
Sebastian Jansson9a03dd82018-02-22 10:31:14 +0100203 std::unique_ptr<RtpTransportControllerSend> controller_send =
Karl Wiberg918f50c2018-07-05 11:40:33 +0200204 absl::make_unique<RtpTransportControllerSend>(
Sebastian Jansson50eb4c42018-08-03 13:25:17 +0200205 Clock::GetRealTimeClock(), config.event_log, injected_factory,
206 config.bitrate_config);
Sebastian Jansson9a03dd82018-02-22 10:31:14 +0100207 sender_call_transport_controller_ = controller_send.get();
208 sender_call_.reset(Call::Create(config, std::move(controller_send)));
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000209}
210
211void CallTest::CreateReceiverCall(const Call::Config& config) {
212 receiver_call_.reset(Call::Create(config));
213}
214
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200215void CallTest::DestroyCalls() {
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100216 sender_call_.reset();
217 receiver_call_.reset();
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200218}
219
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +0100220void CallTest::CreateVideoSendConfig(VideoSendStream::Config* video_config,
221 size_t num_video_streams,
222 size_t num_used_ssrcs,
223 Transport* send_transport) {
224 RTC_DCHECK_LE(num_video_streams + num_used_ssrcs, kNumSsrcs);
225 *video_config = VideoSendStream::Config(send_transport);
Niels Möller4db138e2018-04-19 09:04:13 +0200226 video_config->encoder_settings.encoder_factory = &fake_encoder_factory_;
Niels Möller259a4972018-04-05 15:36:51 +0200227 video_config->rtp.payload_name = "FAKE";
228 video_config->rtp.payload_type = kFakeVideoSendPayloadType;
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +0100229 video_config->rtp.extensions.push_back(
230 RtpExtension(RtpExtension::kTransportSequenceNumberUri,
231 kTransportSequenceNumberExtensionId));
232 video_config->rtp.extensions.push_back(RtpExtension(
233 RtpExtension::kVideoContentTypeUri, kVideoContentTypeExtensionId));
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200234 if (video_encoder_configs_.empty()) {
235 video_encoder_configs_.emplace_back();
236 FillEncoderConfiguration(kVideoCodecGeneric, num_video_streams,
237 &video_encoder_configs_.back());
238 }
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +0100239
240 for (size_t i = 0; i < num_video_streams; ++i)
241 video_config->rtp.ssrcs.push_back(kVideoSendSsrcs[num_used_ssrcs + i]);
242 video_config->rtp.extensions.push_back(RtpExtension(
243 RtpExtension::kVideoRotationUri, kVideoRotationRtpExtensionId));
244}
245
246void CallTest::CreateAudioAndFecSendConfigs(size_t num_audio_streams,
247 size_t num_flexfec_streams,
248 Transport* send_transport) {
kwibergaf476c72016-11-28 15:21:39 -0800249 RTC_DCHECK_LE(num_audio_streams, 1);
250 RTC_DCHECK_LE(num_flexfec_streams, 1);
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100251 if (num_audio_streams > 0) {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200252 AudioSendStream::Config audio_send_config(send_transport);
253 audio_send_config.rtp.ssrc = kAudioSendSsrc;
254 audio_send_config.send_codec_spec = AudioSendStream::Config::SendCodecSpec(
Oskar Sundbom3f6804d2017-11-16 10:54:58 +0100255 kAudioSendPayloadType, {"opus", 48000, 2, {{"stereo", "1"}}});
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200256 audio_send_config.encoder_factory = audio_encoder_factory_;
257 SetAudioConfig(audio_send_config);
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100258 }
brandtr841de6a2016-11-15 07:10:52 -0800259
260 // TODO(brandtr): Update this when we support multistream protection.
261 if (num_flexfec_streams > 0) {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200262 SetSendFecConfig({kVideoSendSsrcs[0]});
brandtr841de6a2016-11-15 07:10:52 -0800263 }
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000264}
265
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200266void CallTest::SetAudioConfig(const AudioSendStream::Config& config) {
267 audio_send_config_ = config;
268}
269
270void CallTest::SetSendFecConfig(std::vector<uint32_t> video_send_ssrcs) {
271 GetVideoSendConfig()->rtp.flexfec.payload_type = kFlexfecPayloadType;
272 GetVideoSendConfig()->rtp.flexfec.ssrc = kFlexfecSendSsrc;
273 GetVideoSendConfig()->rtp.flexfec.protected_media_ssrcs = video_send_ssrcs;
274}
275
276void CallTest::SetSendUlpFecConfig(VideoSendStream::Config* send_config) {
277 send_config->rtp.ulpfec.red_payload_type = kRedPayloadType;
278 send_config->rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType;
279 send_config->rtp.ulpfec.red_rtx_payload_type = kRtxRedPayloadType;
280}
281
282void CallTest::SetReceiveUlpFecConfig(
283 VideoReceiveStream::Config* receive_config) {
284 receive_config->rtp.red_payload_type = kRedPayloadType;
285 receive_config->rtp.ulpfec_payload_type = kUlpfecPayloadType;
286 receive_config->rtp.rtx_associated_payload_types[kRtxRedPayloadType] =
287 kRedPayloadType;
288}
289
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +0100290void CallTest::CreateSendConfig(size_t num_video_streams,
291 size_t num_audio_streams,
292 size_t num_flexfec_streams,
293 Transport* send_transport) {
294 if (num_video_streams > 0) {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200295 video_send_configs_.clear();
296 video_send_configs_.emplace_back(nullptr);
297 CreateVideoSendConfig(&video_send_configs_.back(), num_video_streams, 0,
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +0100298 send_transport);
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100299 }
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +0100300 CreateAudioAndFecSendConfigs(num_audio_streams, num_flexfec_streams,
301 send_transport);
302}
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100303
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200304void CallTest::CreateMatchingVideoReceiveConfigs(
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +0100305 const VideoSendStream::Config& video_send_config,
306 Transport* rtcp_send_transport) {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200307 CreateMatchingVideoReceiveConfigs(video_send_config, rtcp_send_transport,
308 true, absl::nullopt, false, 0);
309}
310
311void CallTest::CreateMatchingVideoReceiveConfigs(
312 const VideoSendStream::Config& video_send_config,
313 Transport* rtcp_send_transport,
314 bool send_side_bwe,
315 absl::optional<size_t> decode_sub_stream,
316 bool receiver_reference_time_report,
317 int rtp_history_ms) {
318 AddMatchingVideoReceiveConfigs(
319 &video_receive_configs_, video_send_config, rtcp_send_transport,
320 send_side_bwe, decode_sub_stream, receiver_reference_time_report,
321 rtp_history_ms);
322}
323
324void CallTest::AddMatchingVideoReceiveConfigs(
325 std::vector<VideoReceiveStream::Config>* receive_configs,
326 const VideoSendStream::Config& video_send_config,
327 Transport* rtcp_send_transport,
328 bool send_side_bwe,
329 absl::optional<size_t> decode_sub_stream,
330 bool receiver_reference_time_report,
331 int rtp_history_ms) {
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +0100332 RTC_DCHECK(!video_send_config.rtp.ssrcs.empty());
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200333 VideoReceiveStream::Config default_config(rtcp_send_transport);
334 default_config.rtp.remb = !send_side_bwe;
335 default_config.rtp.transport_cc = send_side_bwe;
336 default_config.rtp.local_ssrc = kReceiverLocalVideoSsrc;
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +0100337 for (const RtpExtension& extension : video_send_config.rtp.extensions)
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200338 default_config.rtp.extensions.push_back(extension);
339 default_config.rtp.nack.rtp_history_ms = rtp_history_ms;
340 // Enable RTT calculation so NTP time estimator will work.
341 default_config.rtp.rtcp_xr.receiver_reference_time_report =
342 receiver_reference_time_report;
343 default_config.renderer = &fake_renderer_;
344
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +0100345 for (size_t i = 0; i < video_send_config.rtp.ssrcs.size(); ++i) {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200346 VideoReceiveStream::Config video_recv_config(default_config.Copy());
347 video_recv_config.decoders.clear();
348 if (!video_send_config.rtp.rtx.ssrcs.empty()) {
349 video_recv_config.rtp.rtx_ssrc = video_send_config.rtp.rtx.ssrcs[i];
350 video_recv_config.rtp.rtx_associated_payload_types[kSendRtxPayloadType] =
351 video_send_config.rtp.payload_type;
352 }
353 video_recv_config.rtp.remote_ssrc = video_send_config.rtp.ssrcs[i];
354 VideoReceiveStream::Decoder decoder;
355
356 // Force fake decoders on non-selected simulcast streams.
357 if (!decode_sub_stream || i == *decode_sub_stream) {
358 decoder = test::CreateMatchingDecoder(video_send_config);
359 } else {
360 decoder.decoder = new test::FakeDecoder();
361 decoder.payload_type = video_send_config.rtp.payload_type;
362 decoder.payload_name = video_send_config.rtp.payload_name;
363 }
364 allocated_decoders_.emplace_back(decoder.decoder);
365 video_recv_config.decoders.push_back(decoder);
366 receive_configs->emplace_back(std::move(video_recv_config));
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +0100367 }
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +0100368}
369
370void CallTest::CreateMatchingAudioAndFecConfigs(
371 Transport* rtcp_send_transport) {
kwibergaf476c72016-11-28 15:21:39 -0800372 RTC_DCHECK_GE(1, num_audio_streams_);
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100373 if (num_audio_streams_ == 1) {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200374 CreateMatchingAudioConfigs(rtcp_send_transport, "");
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000375 }
brandtr841de6a2016-11-15 07:10:52 -0800376
377 // TODO(brandtr): Update this when we support multistream protection.
378 RTC_DCHECK(num_flexfec_streams_ <= 1);
379 if (num_flexfec_streams_ == 1) {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200380 CreateMatchingFecConfig(rtcp_send_transport, *GetVideoSendConfig());
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200381 for (const RtpExtension& extension : GetVideoSendConfig()->rtp.extensions)
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200382 GetFlexFecConfig()->rtp_header_extensions.push_back(extension);
brandtr841de6a2016-11-15 07:10:52 -0800383 }
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000384}
385
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200386void CallTest::CreateMatchingAudioConfigs(Transport* transport,
387 std::string sync_group) {
388 audio_receive_configs_.push_back(CreateMatchingAudioConfig(
389 audio_send_config_, audio_decoder_factory_, transport, sync_group));
390}
391
392AudioReceiveStream::Config CallTest::CreateMatchingAudioConfig(
393 const AudioSendStream::Config& send_config,
394 rtc::scoped_refptr<AudioDecoderFactory> audio_decoder_factory,
395 Transport* transport,
396 std::string sync_group) {
397 AudioReceiveStream::Config audio_config;
398 audio_config.rtp.local_ssrc = kReceiverLocalAudioSsrc;
399 audio_config.rtcp_send_transport = transport;
400 audio_config.rtp.remote_ssrc = send_config.rtp.ssrc;
401 audio_config.rtp.transport_cc =
402 send_config.send_codec_spec
403 ? send_config.send_codec_spec->transport_cc_enabled
404 : false;
405 audio_config.rtp.extensions = send_config.rtp.extensions;
406 audio_config.decoder_factory = audio_decoder_factory;
407 audio_config.decoder_map = {{kAudioSendPayloadType, {"opus", 48000, 2}}};
408 audio_config.sync_group = sync_group;
409 return audio_config;
410}
411
412void CallTest::CreateMatchingFecConfig(
413 Transport* transport,
414 const VideoSendStream::Config& send_config) {
415 FlexfecReceiveStream::Config config(transport);
416 config.payload_type = send_config.rtp.flexfec.payload_type;
417 config.remote_ssrc = send_config.rtp.flexfec.ssrc;
418 config.protected_media_ssrcs = send_config.rtp.flexfec.protected_media_ssrcs;
419 config.local_ssrc = kReceiverLocalVideoSsrc;
420 if (!video_receive_configs_.empty())
421 video_receive_configs_[0].rtp.protected_by_flexfec = true;
422 flexfec_receive_configs_.push_back(config);
423}
424
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +0100425void CallTest::CreateMatchingReceiveConfigs(Transport* rtcp_send_transport) {
426 video_receive_configs_.clear();
427 allocated_decoders_.clear();
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200428 for (VideoSendStream::Config& video_send_config : video_send_configs_) {
429 CreateMatchingVideoReceiveConfigs(video_send_config, rtcp_send_transport);
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +0100430 }
431 CreateMatchingAudioAndFecConfigs(rtcp_send_transport);
432}
433
danilchap9c6a0c72016-02-10 10:54:47 -0800434void CallTest::CreateFrameGeneratorCapturerWithDrift(Clock* clock,
perkjfa10b552016-10-02 23:45:26 -0700435 float speed,
436 int framerate,
437 int width,
438 int height) {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200439 video_sources_.clear();
440 video_capturers_.clear();
441 frame_generator_capturer_ = test::FrameGeneratorCapturer::Create(
442 width, height, absl::nullopt, absl::nullopt, framerate * speed, clock);
443 video_capturers_.emplace_back(
444 std::unique_ptr<FrameGeneratorCapturer>(frame_generator_capturer_));
445 video_sources_.push_back(video_capturers_.back().get());
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200446 ConnectVideoSourcesToStreams();
danilchap9c6a0c72016-02-10 10:54:47 -0800447}
448
perkjfa10b552016-10-02 23:45:26 -0700449void CallTest::CreateFrameGeneratorCapturer(int framerate,
450 int width,
451 int height) {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200452 video_sources_.clear();
453 video_capturers_.clear();
454 frame_generator_capturer_ = test::FrameGeneratorCapturer::Create(
455 width, height, absl::nullopt, absl::nullopt, framerate, clock_);
456 video_capturers_.emplace_back(
457 std::unique_ptr<FrameGeneratorCapturer>(frame_generator_capturer_));
458 video_sources_.push_back(video_capturers_.back().get());
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200459 ConnectVideoSourcesToStreams();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000460}
pbosf1828e82015-07-28 08:20:59 -0700461
oprypin92220ff2017-03-23 03:40:03 -0700462void CallTest::CreateFakeAudioDevices(
Artem Titov3faa8322018-03-07 14:44:00 +0100463 std::unique_ptr<TestAudioDeviceModule::Capturer> capturer,
464 std::unique_ptr<TestAudioDeviceModule::Renderer> renderer) {
465 fake_send_audio_device_ = TestAudioDeviceModule::CreateTestAudioDeviceModule(
Fredrik Solenberg2a877972017-12-15 16:42:15 +0100466 std::move(capturer), nullptr, 1.f);
Artem Titov3faa8322018-03-07 14:44:00 +0100467 fake_recv_audio_device_ = TestAudioDeviceModule::CreateTestAudioDeviceModule(
Fredrik Solenberg2a877972017-12-15 16:42:15 +0100468 nullptr, std::move(renderer), 1.f);
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100469}
470
471void CallTest::CreateVideoStreams() {
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100472 RTC_DCHECK(video_receive_streams_.empty());
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200473 CreateVideoSendStreams();
stefanff483612015-12-21 03:14:00 -0800474 for (size_t i = 0; i < video_receive_configs_.size(); ++i) {
Tommi733b5472016-06-10 17:58:01 +0200475 video_receive_streams_.push_back(receiver_call_->CreateVideoReceiveStream(
476 video_receive_configs_[i].Copy()));
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000477 }
eladalonc0d481a2017-08-02 07:39:07 -0700478
479 AssociateFlexfecStreamsWithVideoStreams();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000480}
481
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200482void CallTest::CreateVideoSendStreams() {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200483 RTC_DCHECK(video_send_streams_.empty());
484
485 // We currently only support testing external fec controllers with a single
486 // VideoSendStream.
487 if (fec_controller_factory_.get()) {
488 RTC_DCHECK_LE(video_send_configs_.size(), 1);
489 }
490
491 // TODO(http://crbug/818127):
492 // Remove this workaround when ALR is not screenshare-specific.
493 std::list<size_t> streams_creation_order;
494 for (size_t i = 0; i < video_send_configs_.size(); ++i) {
495 // If dual streams are created, add the screenshare stream last.
496 if (video_encoder_configs_[i].content_type ==
497 VideoEncoderConfig::ContentType::kScreen) {
498 streams_creation_order.push_back(i);
499 } else {
500 streams_creation_order.push_front(i);
501 }
502 }
503
504 video_send_streams_.resize(video_send_configs_.size(), nullptr);
505
506 for (size_t i : streams_creation_order) {
507 if (fec_controller_factory_.get()) {
508 video_send_streams_[i] = sender_call_->CreateVideoSendStream(
509 video_send_configs_[i].Copy(), video_encoder_configs_[i].Copy(),
510 fec_controller_factory_->CreateFecController());
511 } else {
512 video_send_streams_[i] = sender_call_->CreateVideoSendStream(
513 video_send_configs_[i].Copy(), video_encoder_configs_[i].Copy());
514 }
515 }
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200516}
517
518void CallTest::CreateVideoSendStream(const VideoEncoderConfig& encoder_config) {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200519 RTC_DCHECK(video_send_streams_.empty());
520 video_send_streams_.push_back(sender_call_->CreateVideoSendStream(
521 GetVideoSendConfig()->Copy(), encoder_config.Copy()));
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200522}
523
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100524void CallTest::CreateAudioStreams() {
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +0100525 RTC_DCHECK(audio_send_stream_ == nullptr);
526 RTC_DCHECK(audio_receive_streams_.empty());
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100527 audio_send_stream_ = sender_call_->CreateAudioSendStream(audio_send_config_);
528 for (size_t i = 0; i < audio_receive_configs_.size(); ++i) {
529 audio_receive_streams_.push_back(
530 receiver_call_->CreateAudioReceiveStream(audio_receive_configs_[i]));
531 }
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100532}
533
brandtr841de6a2016-11-15 07:10:52 -0800534void CallTest::CreateFlexfecStreams() {
535 for (size_t i = 0; i < flexfec_receive_configs_.size(); ++i) {
536 flexfec_receive_streams_.push_back(
537 receiver_call_->CreateFlexfecReceiveStream(
538 flexfec_receive_configs_[i]));
539 }
eladalonc0d481a2017-08-02 07:39:07 -0700540
541 AssociateFlexfecStreamsWithVideoStreams();
542}
543
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200544void CallTest::ConnectVideoSourcesToStreams() {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200545 for (size_t i = 0; i < video_sources_.size(); ++i)
546 video_send_streams_[i]->SetSource(video_sources_[i],
547 degradation_preference_);
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200548}
549
eladalonc0d481a2017-08-02 07:39:07 -0700550void CallTest::AssociateFlexfecStreamsWithVideoStreams() {
551 // All FlexFEC streams protect all of the video streams.
552 for (FlexfecReceiveStream* flexfec_recv_stream : flexfec_receive_streams_) {
553 for (VideoReceiveStream* video_recv_stream : video_receive_streams_) {
554 video_recv_stream->AddSecondarySink(flexfec_recv_stream);
555 }
556 }
557}
558
559void CallTest::DissociateFlexfecStreamsFromVideoStreams() {
560 for (FlexfecReceiveStream* flexfec_recv_stream : flexfec_receive_streams_) {
561 for (VideoReceiveStream* video_recv_stream : video_receive_streams_) {
562 video_recv_stream->RemoveSecondarySink(flexfec_recv_stream);
563 }
564 }
brandtr841de6a2016-11-15 07:10:52 -0800565}
566
eladalon445f1a12017-08-09 01:52:36 -0700567void CallTest::Start() {
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200568 StartVideoStreams();
eladalon445f1a12017-08-09 01:52:36 -0700569 if (audio_send_stream_) {
570 audio_send_stream_->Start();
571 }
572 for (AudioReceiveStream* audio_recv_stream : audio_receive_streams_)
573 audio_recv_stream->Start();
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200574 StartVideoCapture();
575}
576
577void CallTest::StartVideoStreams() {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200578 for (VideoSendStream* video_send_stream : video_send_streams_)
579 video_send_stream->Start();
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200580 for (VideoReceiveStream* video_recv_stream : video_receive_streams_)
581 video_recv_stream->Start();
582}
583
584void CallTest::StartVideoCapture() {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200585 for (auto& capturer : video_capturers_)
586 capturer->Start();
eladalon445f1a12017-08-09 01:52:36 -0700587}
588
589void CallTest::Stop() {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200590 StopVideoCapture();
eladalon445f1a12017-08-09 01:52:36 -0700591 for (AudioReceiveStream* audio_recv_stream : audio_receive_streams_)
592 audio_recv_stream->Stop();
593 if (audio_send_stream_) {
594 audio_send_stream_->Stop();
595 }
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200596 StopVideoStreams();
597}
598
599void CallTest::StopVideoCapture() {
600 for (auto& capturer : video_capturers_)
601 capturer->Stop();
602}
603
604void CallTest::StopVideoStreams() {
605 for (VideoSendStream* video_send_stream : video_send_streams_)
606 video_send_stream->Stop();
eladalon445f1a12017-08-09 01:52:36 -0700607 for (VideoReceiveStream* video_recv_stream : video_receive_streams_)
608 video_recv_stream->Stop();
eladalon445f1a12017-08-09 01:52:36 -0700609}
610
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000611void CallTest::DestroyStreams() {
eladalonc0d481a2017-08-02 07:39:07 -0700612 DissociateFlexfecStreamsFromVideoStreams();
613
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100614 if (audio_send_stream_)
615 sender_call_->DestroyAudioSendStream(audio_send_stream_);
616 audio_send_stream_ = nullptr;
617 for (AudioReceiveStream* audio_recv_stream : audio_receive_streams_)
618 receiver_call_->DestroyAudioReceiveStream(audio_recv_stream);
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100619
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200620 DestroyVideoSendStreams();
ilnika014cc52017-03-07 04:21:04 -0800621
brandtrfb45c6c2017-01-27 06:47:55 -0800622 for (VideoReceiveStream* video_recv_stream : video_receive_streams_)
623 receiver_call_->DestroyVideoReceiveStream(video_recv_stream);
624
brandtr841de6a2016-11-15 07:10:52 -0800625 for (FlexfecReceiveStream* flexfec_recv_stream : flexfec_receive_streams_)
626 receiver_call_->DestroyFlexfecReceiveStream(flexfec_recv_stream);
627
628 video_receive_streams_.clear();
pbos@webrtc.org776e6f22014-10-29 15:28:39 +0000629 allocated_decoders_.clear();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000630}
631
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200632void CallTest::DestroyVideoSendStreams() {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200633 for (VideoSendStream* video_send_stream : video_send_streams_)
634 sender_call_->DestroyVideoSendStream(video_send_stream);
635 video_send_streams_.clear();
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200636}
637
eladalon445f1a12017-08-09 01:52:36 -0700638void CallTest::SetFakeVideoCaptureRotation(VideoRotation rotation) {
639 frame_generator_capturer_->SetFakeRotation(rotation);
640}
641
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200642void CallTest::SetVideoDegradation(DegradationPreference preference) {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200643 GetVideoSendStream()->SetSource(frame_generator_capturer_, preference);
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200644}
645
646VideoSendStream::Config* CallTest::GetVideoSendConfig() {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200647 return &video_send_configs_[0];
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200648}
649
650void CallTest::SetVideoSendConfig(const VideoSendStream::Config& config) {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200651 video_send_configs_.clear();
652 video_send_configs_.push_back(config.Copy());
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200653}
654
655VideoEncoderConfig* CallTest::GetVideoEncoderConfig() {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200656 return &video_encoder_configs_[0];
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200657}
658
659void CallTest::SetVideoEncoderConfig(const VideoEncoderConfig& config) {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200660 video_encoder_configs_.clear();
661 video_encoder_configs_.push_back(config.Copy());
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200662}
663
664VideoSendStream* CallTest::GetVideoSendStream() {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200665 return video_send_streams_[0];
666}
667FlexfecReceiveStream::Config* CallTest::GetFlexFecConfig() {
668 return &flexfec_receive_configs_[0];
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200669}
670
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +0100671constexpr size_t CallTest::kNumSsrcs;
perkjfa10b552016-10-02 23:45:26 -0700672const int CallTest::kDefaultWidth;
673const int CallTest::kDefaultHeight;
674const int CallTest::kDefaultFramerate;
Peter Boström5811a392015-12-10 13:02:50 +0100675const int CallTest::kDefaultTimeoutMs = 30 * 1000;
676const int CallTest::kLongTimeoutMs = 120 * 1000;
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +0100677const uint32_t CallTest::kSendRtxSsrcs[kNumSsrcs] = {
678 0xBADCAFD, 0xBADCAFE, 0xBADCAFF, 0xBADCB00, 0xBADCB01, 0xBADCB02};
679const uint32_t CallTest::kVideoSendSsrcs[kNumSsrcs] = {
680 0xC0FFED, 0xC0FFEE, 0xC0FFEF, 0xC0FFF0, 0xC0FFF1, 0xC0FFF2};
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100681const uint32_t CallTest::kAudioSendSsrc = 0xDEADBEEF;
brandtr841de6a2016-11-15 07:10:52 -0800682const uint32_t CallTest::kFlexfecSendSsrc = 0xBADBEEF;
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100683const uint32_t CallTest::kReceiverLocalVideoSsrc = 0x123456;
684const uint32_t CallTest::kReceiverLocalAudioSsrc = 0x1234567;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000685const int CallTest::kNackRtpHistoryMs = 1000;
686
sprangd2702ef2017-07-10 08:41:10 -0700687const uint8_t CallTest::kDefaultKeepalivePayloadType =
688 RtpKeepAliveConfig().payload_type;
689
minyue20c84cc2017-04-10 16:57:57 -0700690const std::map<uint8_t, MediaType> CallTest::payload_type_map_ = {
691 {CallTest::kVideoSendPayloadType, MediaType::VIDEO},
692 {CallTest::kFakeVideoSendPayloadType, MediaType::VIDEO},
693 {CallTest::kSendRtxPayloadType, MediaType::VIDEO},
694 {CallTest::kRedPayloadType, MediaType::VIDEO},
695 {CallTest::kRtxRedPayloadType, MediaType::VIDEO},
696 {CallTest::kUlpfecPayloadType, MediaType::VIDEO},
697 {CallTest::kFlexfecPayloadType, MediaType::VIDEO},
sprangd2702ef2017-07-10 08:41:10 -0700698 {CallTest::kAudioSendPayloadType, MediaType::AUDIO},
699 {CallTest::kDefaultKeepalivePayloadType, MediaType::ANY}};
minyue20c84cc2017-04-10 16:57:57 -0700700
Sebastian Jansson72582242018-07-13 13:19:42 +0200701BaseTest::BaseTest() {}
philipele828c962017-03-21 03:24:27 -0700702
Sebastian Jansson72582242018-07-13 13:19:42 +0200703BaseTest::BaseTest(int timeout_ms) : RtpRtcpObserver(timeout_ms) {}
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000704
Yves Gerey665174f2018-06-19 15:03:05 +0200705BaseTest::~BaseTest() {}
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000706
Artem Titov3faa8322018-03-07 14:44:00 +0100707std::unique_ptr<TestAudioDeviceModule::Capturer> BaseTest::CreateCapturer() {
708 return TestAudioDeviceModule::CreatePulsedNoiseCapturer(256, 48000);
oprypin92220ff2017-03-23 03:40:03 -0700709}
710
Artem Titov3faa8322018-03-07 14:44:00 +0100711std::unique_ptr<TestAudioDeviceModule::Renderer> BaseTest::CreateRenderer() {
712 return TestAudioDeviceModule::CreateDiscardRenderer(48000);
oprypin92220ff2017-03-23 03:40:03 -0700713}
714
Artem Titov3faa8322018-03-07 14:44:00 +0100715void BaseTest::OnFakeAudioDevicesCreated(
716 TestAudioDeviceModule* send_audio_device,
717 TestAudioDeviceModule* recv_audio_device) {}
oprypin92220ff2017-03-23 03:40:03 -0700718
Sebastian Jansson72582242018-07-13 13:19:42 +0200719void BaseTest::ModifySenderCallConfig(Call::Config* config) {}
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000720
Sebastian Jansson72582242018-07-13 13:19:42 +0200721void BaseTest::ModifyReceiverCallConfig(Call::Config* config) {}
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000722
sprangdb2a9fc2017-08-09 06:42:32 -0700723void BaseTest::OnRtpTransportControllerSendCreated(
724 RtpTransportControllerSend* controller) {}
725
Yves Gerey665174f2018-06-19 15:03:05 +0200726void BaseTest::OnCallsCreated(Call* sender_call, Call* receiver_call) {}
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000727
eladalon413ee9a2017-08-22 04:02:52 -0700728test::PacketTransport* BaseTest::CreateSendTransport(
729 SingleThreadedTaskQueueForTesting* task_queue,
730 Call* sender_call) {
731 return new PacketTransport(
732 task_queue, sender_call, this, test::PacketTransport::kSender,
Artem Titov46c4e602018-08-17 14:26:54 +0200733 CallTest::payload_type_map_, DefaultNetworkSimulationConfig());
stefane74eef12016-01-08 06:47:13 -0800734}
735
eladalon413ee9a2017-08-22 04:02:52 -0700736test::PacketTransport* BaseTest::CreateReceiveTransport(
737 SingleThreadedTaskQueueForTesting* task_queue) {
738 return new PacketTransport(
739 task_queue, nullptr, this, test::PacketTransport::kReceiver,
Artem Titov46c4e602018-08-17 14:26:54 +0200740 CallTest::payload_type_map_, DefaultNetworkSimulationConfig());
stefane74eef12016-01-08 06:47:13 -0800741}
stefanf116bd02015-10-27 08:29:42 -0700742
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100743size_t BaseTest::GetNumVideoStreams() const {
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000744 return 1;
745}
746
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100747size_t BaseTest::GetNumAudioStreams() const {
748 return 0;
749}
750
brandtr841de6a2016-11-15 07:10:52 -0800751size_t BaseTest::GetNumFlexfecStreams() const {
752 return 0;
753}
754
stefanff483612015-12-21 03:14:00 -0800755void BaseTest::ModifyVideoConfigs(
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000756 VideoSendStream::Config* send_config,
757 std::vector<VideoReceiveStream::Config>* receive_configs,
stefanff483612015-12-21 03:14:00 -0800758 VideoEncoderConfig* encoder_config) {}
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000759
perkjfa10b552016-10-02 23:45:26 -0700760void BaseTest::ModifyVideoCaptureStartResolution(int* width,
761 int* heigt,
762 int* frame_rate) {}
763
stefanff483612015-12-21 03:14:00 -0800764void BaseTest::OnVideoStreamsCreated(
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000765 VideoSendStream* send_stream,
stefanff483612015-12-21 03:14:00 -0800766 const std::vector<VideoReceiveStream*>& receive_streams) {}
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000767
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100768void BaseTest::ModifyAudioConfigs(
769 AudioSendStream::Config* send_config,
770 std::vector<AudioReceiveStream::Config>* receive_configs) {}
771
772void BaseTest::OnAudioStreamsCreated(
773 AudioSendStream* send_stream,
774 const std::vector<AudioReceiveStream*>& receive_streams) {}
775
brandtr841de6a2016-11-15 07:10:52 -0800776void BaseTest::ModifyFlexfecConfigs(
777 std::vector<FlexfecReceiveStream::Config>* receive_configs) {}
778
779void BaseTest::OnFlexfecStreamsCreated(
780 const std::vector<FlexfecReceiveStream*>& receive_streams) {}
781
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000782void BaseTest::OnFrameGeneratorCapturerCreated(
Yves Gerey665174f2018-06-19 15:03:05 +0200783 FrameGeneratorCapturer* frame_generator_capturer) {}
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000784
Yves Gerey665174f2018-06-19 15:03:05 +0200785void BaseTest::OnStreamsStopped() {}
oprypin92220ff2017-03-23 03:40:03 -0700786
Sebastian Jansson72582242018-07-13 13:19:42 +0200787SendTest::SendTest(int timeout_ms) : BaseTest(timeout_ms) {}
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000788
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000789bool SendTest::ShouldCreateReceivers() const {
790 return false;
791}
792
philipele828c962017-03-21 03:24:27 -0700793EndToEndTest::EndToEndTest() {}
794
Sebastian Jansson72582242018-07-13 13:19:42 +0200795EndToEndTest::EndToEndTest(int timeout_ms) : BaseTest(timeout_ms) {}
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000796
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000797bool EndToEndTest::ShouldCreateReceivers() const {
798 return true;
799}
800
801} // namespace test
802} // namespace webrtc