blob: 5fc7feb3c03a74edb1ec346977bd16c63d09292f [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>
Mirko Bonadei317a1f02019-09-17 17:06:18 +020014#include <memory>
brandtr841de6a2016-11-15 07:10:52 -080015
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"
Danil Chapovalova92e6242019-04-18 10:58:56 +020018#include "api/task_queue/default_task_queue_factory.h"
Danil Chapovalov44db4362019-09-30 04:16:28 +020019#include "api/task_queue/task_queue_base.h"
Artem Titov33f9d2b2019-12-05 15:59:00 +010020#include "api/test/create_frame_generator.h"
Jiawei Ouc2ebe212018-11-08 10:02:56 -080021#include "api/video/builtin_video_bitrate_allocator_factory.h"
Artem Titov4e199e92018-08-20 13:30:39 +020022#include "call/fake_network_pipe.h"
Per Kjellander89870ff2023-01-19 15:45:58 +000023#include "call/packet_receiver.h"
Artem Titov4e199e92018-08-20 13:30:39 +020024#include "call/simulated_network.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020025#include "modules/audio_mixer/audio_mixer_impl.h"
26#include "rtc_base/checks.h"
27#include "rtc_base/event.h"
Danil Chapovalov82a3f0a2019-10-21 09:24:27 +020028#include "rtc_base/task_queue_for_test.h"
Niels Möller4db138e2018-04-19 09:04:13 +020029#include "test/fake_encoder.h"
Per Kjellander89870ff2023-01-19 15:45:58 +000030#include "test/rtp_rtcp_observer.h"
Steve Anton10542f22019-01-11 09:11:00 -080031#include "test/testsupport/file_utils.h"
Jonas Oreland6c2dae22022-09-29 10:28:24 +020032#include "video/config/video_encoder_config.h"
eladalon413ee9a2017-08-22 04:02:52 -070033
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000034namespace webrtc {
35namespace test {
36
37CallTest::CallTest()
pbos@webrtc.org2bb1bda2014-07-07 13:06:48 +000038 : clock_(Clock::GetRealTimeClock()),
Danil Chapovalova92e6242019-04-18 10:58:56 +020039 task_queue_factory_(CreateDefaultTaskQueueFactory()),
Mirko Bonadei317a1f02019-09-17 17:06:18 +020040 send_event_log_(std::make_unique<RtcEventLogNull>()),
41 recv_event_log_(std::make_unique<RtcEventLogNull>()),
Bjorn A Mellem7a9a0922019-11-26 09:19:40 -080042 audio_send_config_(/*send_transport=*/nullptr),
Stefan Holmer9fea80f2016-01-07 17:43:18 +010043 audio_send_stream_(nullptr),
Erik Språng6a32de42019-01-09 15:46:36 +010044 frame_generator_capturer_(nullptr),
Niels Möller4db138e2018-04-19 09:04:13 +020045 fake_encoder_factory_([this]() {
Ilya Nikolaevskiyb0588e62018-08-27 14:12:27 +020046 std::unique_ptr<FakeEncoder> fake_encoder;
47 if (video_encoder_configs_[0].codec_type == kVideoCodecVP8) {
Nikita Zetilov8e9fd482020-03-06 10:43:41 +010048 fake_encoder = std::make_unique<FakeVp8Encoder>(clock_);
Ilya Nikolaevskiyb0588e62018-08-27 14:12:27 +020049 } else {
Mirko Bonadei317a1f02019-09-17 17:06:18 +020050 fake_encoder = std::make_unique<FakeEncoder>(clock_);
Ilya Nikolaevskiyb0588e62018-08-27 14:12:27 +020051 }
52 fake_encoder->SetMaxBitrate(fake_encoder_max_bitrate_);
53 return fake_encoder;
Niels Möller4db138e2018-04-19 09:04:13 +020054 }),
Mirko Bonadei317a1f02019-09-17 17:06:18 +020055 fake_decoder_factory_([]() { return std::make_unique<FakeDecoder>(); }),
Jiawei Ouc2ebe212018-11-08 10:02:56 -080056 bitrate_allocator_factory_(CreateBuiltinVideoBitrateAllocatorFactory()),
Stefan Holmer04cb7632016-01-14 20:34:30 +010057 num_video_streams_(1),
Stefan Holmer9fea80f2016-01-07 17:43:18 +010058 num_audio_streams_(0),
brandtr841de6a2016-11-15 07:10:52 -080059 num_flexfec_streams_(0),
Niels Möller2784a032018-03-28 14:16:04 +020060 audio_decoder_factory_(CreateBuiltinAudioDecoderFactory()),
61 audio_encoder_factory_(CreateBuiltinAudioEncoderFactory()),
Danil Chapovalov1b668902019-11-13 11:19:53 +010062 task_queue_(task_queue_factory_->CreateTaskQueue(
63 "CallTestTaskQueue",
64 TaskQueueFactory::Priority::NORMAL)) {}
pbos@webrtc.org32452b22014-10-22 12:15:24 +000065
Danil Chapovalov577c5802019-10-31 12:33:17 +010066CallTest::~CallTest() = default;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000067
Elad Alond8d32482019-02-18 23:45:57 +010068void CallTest::RegisterRtpExtension(const RtpExtension& extension) {
69 for (const RtpExtension& registered_extension : rtp_extensions_) {
70 if (registered_extension.id == extension.id) {
71 ASSERT_EQ(registered_extension.uri, extension.uri)
72 << "Different URIs associated with ID " << extension.id << ".";
73 ASSERT_EQ(registered_extension.encrypt, extension.encrypt)
74 << "Encryption mismatch associated with ID " << extension.id << ".";
75 return;
76 } else { // Different IDs.
77 // Different IDs referring to the same extension probably indicate
78 // a mistake in the test.
79 ASSERT_FALSE(registered_extension.uri == extension.uri &&
80 registered_extension.encrypt == extension.encrypt)
81 << "URI " << extension.uri
82 << (extension.encrypt ? " with " : " without ")
83 << "encryption already registered with a different "
Jonas Olssonb2b20312020-01-14 12:11:31 +010084 "ID ("
85 << extension.id << " vs. " << registered_extension.id << ").";
Elad Alond8d32482019-02-18 23:45:57 +010086 }
87 }
88 rtp_extensions_.push_back(extension);
89}
90
stefane74eef12016-01-08 06:47:13 -080091void CallTest::RunBaseTest(BaseTest* test) {
Danil Chapovalove519f382022-08-11 12:26:09 +020092 SendTask(task_queue(), [this, test]() {
eladalon413ee9a2017-08-22 04:02:52 -070093 num_video_streams_ = test->GetNumVideoStreams();
94 num_audio_streams_ = test->GetNumAudioStreams();
95 num_flexfec_streams_ = test->GetNumFlexfecStreams();
96 RTC_DCHECK(num_video_streams_ > 0 || num_audio_streams_ > 0);
Sebastian Jansson72582242018-07-13 13:19:42 +020097 Call::Config send_config(send_event_log_.get());
Niels Möllerde8e6e62018-11-13 15:10:33 +010098 test->ModifySenderBitrateConfig(&send_config.bitrate_config);
Stefan Holmer9fea80f2016-01-07 17:43:18 +010099 if (num_audio_streams_ > 0) {
eladalon413ee9a2017-08-22 04:02:52 -0700100 CreateFakeAudioDevices(test->CreateCapturer(), test->CreateRenderer());
101 test->OnFakeAudioDevicesCreated(fake_send_audio_device_.get(),
102 fake_recv_audio_device_.get());
Ivo Creusen62337e52018-01-09 14:17:33 +0100103 apm_send_ = AudioProcessingBuilder().Create();
104 apm_recv_ = AudioProcessingBuilder().Create();
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100105 EXPECT_EQ(0, fake_send_audio_device_->Init());
106 EXPECT_EQ(0, fake_recv_audio_device_->Init());
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100107 AudioState::Config audio_state_config;
aleloi10111bc2016-11-17 06:48:48 -0800108 audio_state_config.audio_mixer = AudioMixerImpl::Create();
eladalon413ee9a2017-08-22 04:02:52 -0700109 audio_state_config.audio_processing = apm_send_;
Fredrik Solenberg2a877972017-12-15 16:42:15 +0100110 audio_state_config.audio_device_module = fake_send_audio_device_;
eladalon413ee9a2017-08-22 04:02:52 -0700111 send_config.audio_state = AudioState::Create(audio_state_config);
Fredrik Solenbergd3195342017-11-21 20:33:05 +0100112 fake_send_audio_device_->RegisterAudioCallback(
113 send_config.audio_state->audio_transport());
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100114 }
eladalon413ee9a2017-08-22 04:02:52 -0700115 CreateSenderCall(send_config);
eladalon413ee9a2017-08-22 04:02:52 -0700116 if (test->ShouldCreateReceivers()) {
Sebastian Jansson72582242018-07-13 13:19:42 +0200117 Call::Config recv_config(recv_event_log_.get());
Niels Möllerde8e6e62018-11-13 15:10:33 +0100118 test->ModifyReceiverBitrateConfig(&recv_config.bitrate_config);
eladalon413ee9a2017-08-22 04:02:52 -0700119 if (num_audio_streams_ > 0) {
120 AudioState::Config audio_state_config;
eladalon413ee9a2017-08-22 04:02:52 -0700121 audio_state_config.audio_mixer = AudioMixerImpl::Create();
122 audio_state_config.audio_processing = apm_recv_;
Fredrik Solenberg2a877972017-12-15 16:42:15 +0100123 audio_state_config.audio_device_module = fake_recv_audio_device_;
eladalon413ee9a2017-08-22 04:02:52 -0700124 recv_config.audio_state = AudioState::Create(audio_state_config);
Fredrik Solenbergd3195342017-11-21 20:33:05 +0100125 fake_recv_audio_device_->RegisterAudioCallback(
Yves Gerey665174f2018-06-19 15:03:05 +0200126 recv_config.audio_state->audio_transport());
127 }
eladalon413ee9a2017-08-22 04:02:52 -0700128 CreateReceiverCall(recv_config);
129 }
130 test->OnCallsCreated(sender_call_.get(), receiver_call_.get());
Per Kjellander89870ff2023-01-19 15:45:58 +0000131 CreateReceiveTransport(test->GetReceiveTransportConfig(), test);
132 CreateSendTransport(test->GetSendTransportConfig(), test);
133 test->OnTransportCreated(send_transport_.get(), send_simulated_network_,
134 receive_transport_.get(),
135 receive_simulated_network_);
eladalon413ee9a2017-08-22 04:02:52 -0700136 if (test->ShouldCreateReceivers()) {
eladalon413ee9a2017-08-22 04:02:52 -0700137 if (num_video_streams_ > 0)
138 receiver_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp);
139 if (num_audio_streams_ > 0)
140 receiver_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkUp);
141 } else {
142 // Sender-only call delivers to itself.
143 send_transport_->SetReceiver(sender_call_->Receiver());
144 receive_transport_->SetReceiver(nullptr);
145 }
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000146
eladalon413ee9a2017-08-22 04:02:52 -0700147 CreateSendConfig(num_video_streams_, num_audio_streams_,
148 num_flexfec_streams_, send_transport_.get());
149 if (test->ShouldCreateReceivers()) {
Per Kjellander89870ff2023-01-19 15:45:58 +0000150 CreateMatchingReceiveConfigs();
eladalon413ee9a2017-08-22 04:02:52 -0700151 }
152 if (num_video_streams_ > 0) {
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200153 test->ModifyVideoConfigs(GetVideoSendConfig(), &video_receive_configs_,
154 GetVideoEncoderConfig());
eladalon413ee9a2017-08-22 04:02:52 -0700155 }
156 if (num_audio_streams_ > 0) {
157 test->ModifyAudioConfigs(&audio_send_config_, &audio_receive_configs_);
158 }
159 if (num_flexfec_streams_ > 0) {
160 test->ModifyFlexfecConfigs(&flexfec_receive_configs_);
161 }
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100162
eladalon413ee9a2017-08-22 04:02:52 -0700163 if (num_flexfec_streams_ > 0) {
164 CreateFlexfecStreams();
165 test->OnFlexfecStreamsCreated(flexfec_receive_streams_);
166 }
167 if (num_video_streams_ > 0) {
168 CreateVideoStreams();
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200169 test->OnVideoStreamsCreated(GetVideoSendStream(), video_receive_streams_);
eladalon413ee9a2017-08-22 04:02:52 -0700170 }
171 if (num_audio_streams_ > 0) {
172 CreateAudioStreams();
173 test->OnAudioStreamsCreated(audio_send_stream_, audio_receive_streams_);
174 }
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000175
eladalon413ee9a2017-08-22 04:02:52 -0700176 if (num_video_streams_ > 0) {
177 int width = kDefaultWidth;
178 int height = kDefaultHeight;
179 int frame_rate = kDefaultFramerate;
180 test->ModifyVideoCaptureStartResolution(&width, &height, &frame_rate);
Åsa Perssoncb7eddb2018-11-05 14:11:44 +0100181 test->ModifyVideoDegradationPreference(&degradation_preference_);
eladalon413ee9a2017-08-22 04:02:52 -0700182 CreateFrameGeneratorCapturer(frame_rate, width, height);
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200183 test->OnFrameGeneratorCapturerCreated(frame_generator_capturer_);
eladalon413ee9a2017-08-22 04:02:52 -0700184 }
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000185
eladalon413ee9a2017-08-22 04:02:52 -0700186 Start();
187 });
188
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000189 test->PerformTest();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000190
Danil Chapovalove519f382022-08-11 12:26:09 +0200191 SendTask(task_queue(), [this, test]() {
eladalon413ee9a2017-08-22 04:02:52 -0700192 Stop();
Fredrik Solenberg73276ad2017-09-14 14:46:47 +0200193 test->OnStreamsStopped();
eladalon413ee9a2017-08-22 04:02:52 -0700194 DestroyStreams();
195 send_transport_.reset();
196 receive_transport_.reset();
Tommi31d1bce2019-08-27 11:34:20 +0200197
Erik Språng6a32de42019-01-09 15:46:36 +0100198 frame_generator_capturer_ = nullptr;
eladalon413ee9a2017-08-22 04:02:52 -0700199 DestroyCalls();
Tommi31d1bce2019-08-27 11:34:20 +0200200
201 fake_send_audio_device_ = nullptr;
202 fake_recv_audio_device_ = nullptr;
eladalon413ee9a2017-08-22 04:02:52 -0700203 });
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000204}
205
Sebastian Jansson8e6602f2018-07-13 10:43:20 +0200206void CallTest::CreateCalls() {
207 CreateCalls(Call::Config(send_event_log_.get()),
208 Call::Config(recv_event_log_.get()));
209}
210
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000211void CallTest::CreateCalls(const Call::Config& sender_config,
212 const Call::Config& receiver_config) {
213 CreateSenderCall(sender_config);
214 CreateReceiverCall(receiver_config);
215}
216
Sebastian Jansson8e6602f2018-07-13 10:43:20 +0200217void CallTest::CreateSenderCall() {
218 CreateSenderCall(Call::Config(send_event_log_.get()));
219}
220
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000221void CallTest::CreateSenderCall(const Call::Config& config) {
Ying Wangcab77fd2019-04-16 11:12:49 +0200222 auto sender_config = config;
Danil Chapovalov53d45ba2019-07-03 14:56:33 +0200223 sender_config.task_queue_factory = task_queue_factory_.get();
Ying Wangcab77fd2019-04-16 11:12:49 +0200224 sender_config.network_state_predictor_factory =
225 network_state_predictor_factory_.get();
Sebastian Jansson1391ed22019-04-30 14:23:51 +0200226 sender_config.network_controller_factory = network_controller_factory_.get();
Erik Språng014dd3c2019-11-28 13:44:25 +0100227 sender_config.trials = &field_trials_;
Ying Wangcab77fd2019-04-16 11:12:49 +0200228 sender_call_.reset(Call::Create(sender_config));
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000229}
230
231void CallTest::CreateReceiverCall(const Call::Config& config) {
Danil Chapovalov53d45ba2019-07-03 14:56:33 +0200232 auto receiver_config = config;
233 receiver_config.task_queue_factory = task_queue_factory_.get();
Erik Språng014dd3c2019-11-28 13:44:25 +0100234 receiver_config.trials = &field_trials_;
Danil Chapovalov53d45ba2019-07-03 14:56:33 +0200235 receiver_call_.reset(Call::Create(receiver_config));
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000236}
237
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200238void CallTest::DestroyCalls() {
Per Kjellander89870ff2023-01-19 15:45:58 +0000239 send_transport_.reset();
240 receive_transport_.reset();
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100241 sender_call_.reset();
242 receiver_call_.reset();
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200243}
244
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +0100245void CallTest::CreateVideoSendConfig(VideoSendStream::Config* video_config,
246 size_t num_video_streams,
247 size_t num_used_ssrcs,
248 Transport* send_transport) {
249 RTC_DCHECK_LE(num_video_streams + num_used_ssrcs, kNumSsrcs);
250 *video_config = VideoSendStream::Config(send_transport);
Niels Möller4db138e2018-04-19 09:04:13 +0200251 video_config->encoder_settings.encoder_factory = &fake_encoder_factory_;
Jiawei Ouc2ebe212018-11-08 10:02:56 -0800252 video_config->encoder_settings.bitrate_allocator_factory =
253 bitrate_allocator_factory_.get();
Niels Möller259a4972018-04-05 15:36:51 +0200254 video_config->rtp.payload_name = "FAKE";
255 video_config->rtp.payload_type = kFakeVideoSendPayloadType;
Johannes Kronf7f13e02018-12-12 11:17:43 +0100256 video_config->rtp.extmap_allow_mixed = true;
Elad Alond8d32482019-02-18 23:45:57 +0100257 AddRtpExtensionByUri(RtpExtension::kTransportSequenceNumberUri,
258 &video_config->rtp.extensions);
Per K5671c642023-01-25 12:58:50 +0100259 AddRtpExtensionByUri(RtpExtension::kAbsSendTimeUri,
260 &video_config->rtp.extensions);
261 AddRtpExtensionByUri(RtpExtension::kTimestampOffsetUri,
262 &video_config->rtp.extensions);
Elad Alond8d32482019-02-18 23:45:57 +0100263 AddRtpExtensionByUri(RtpExtension::kVideoContentTypeUri,
264 &video_config->rtp.extensions);
Elad Alonccb9b752019-02-19 13:01:31 +0100265 AddRtpExtensionByUri(RtpExtension::kGenericFrameDescriptorUri00,
266 &video_config->rtp.extensions);
Danil Chapovalovce515f72020-02-24 14:29:27 +0100267 AddRtpExtensionByUri(RtpExtension::kDependencyDescriptorUri,
268 &video_config->rtp.extensions);
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200269 if (video_encoder_configs_.empty()) {
270 video_encoder_configs_.emplace_back();
271 FillEncoderConfiguration(kVideoCodecGeneric, num_video_streams,
272 &video_encoder_configs_.back());
273 }
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +0100274 for (size_t i = 0; i < num_video_streams; ++i)
275 video_config->rtp.ssrcs.push_back(kVideoSendSsrcs[num_used_ssrcs + i]);
Elad Alond8d32482019-02-18 23:45:57 +0100276 AddRtpExtensionByUri(RtpExtension::kVideoRotationUri,
277 &video_config->rtp.extensions);
278 AddRtpExtensionByUri(RtpExtension::kColorSpaceUri,
279 &video_config->rtp.extensions);
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +0100280}
281
282void CallTest::CreateAudioAndFecSendConfigs(size_t num_audio_streams,
283 size_t num_flexfec_streams,
284 Transport* send_transport) {
kwibergaf476c72016-11-28 15:21:39 -0800285 RTC_DCHECK_LE(num_audio_streams, 1);
286 RTC_DCHECK_LE(num_flexfec_streams, 1);
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100287 if (num_audio_streams > 0) {
Bjorn A Mellem7a9a0922019-11-26 09:19:40 -0800288 AudioSendStream::Config audio_send_config(send_transport);
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200289 audio_send_config.rtp.ssrc = kAudioSendSsrc;
Per K5671c642023-01-25 12:58:50 +0100290 AddRtpExtensionByUri(RtpExtension::kTransportSequenceNumberUri,
291 &audio_send_config.rtp.extensions);
292
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200293 audio_send_config.send_codec_spec = AudioSendStream::Config::SendCodecSpec(
Oskar Sundbom3f6804d2017-11-16 10:54:58 +0100294 kAudioSendPayloadType, {"opus", 48000, 2, {{"stereo", "1"}}});
Per Kb0d8a372023-01-26 16:11:31 +0100295 audio_send_config.min_bitrate_bps = 6000;
296 audio_send_config.max_bitrate_bps = 60000;
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200297 audio_send_config.encoder_factory = audio_encoder_factory_;
298 SetAudioConfig(audio_send_config);
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100299 }
brandtr841de6a2016-11-15 07:10:52 -0800300
301 // TODO(brandtr): Update this when we support multistream protection.
302 if (num_flexfec_streams > 0) {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200303 SetSendFecConfig({kVideoSendSsrcs[0]});
brandtr841de6a2016-11-15 07:10:52 -0800304 }
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000305}
306
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200307void CallTest::SetAudioConfig(const AudioSendStream::Config& config) {
308 audio_send_config_ = config;
309}
310
311void CallTest::SetSendFecConfig(std::vector<uint32_t> video_send_ssrcs) {
312 GetVideoSendConfig()->rtp.flexfec.payload_type = kFlexfecPayloadType;
313 GetVideoSendConfig()->rtp.flexfec.ssrc = kFlexfecSendSsrc;
314 GetVideoSendConfig()->rtp.flexfec.protected_media_ssrcs = video_send_ssrcs;
315}
316
317void CallTest::SetSendUlpFecConfig(VideoSendStream::Config* send_config) {
318 send_config->rtp.ulpfec.red_payload_type = kRedPayloadType;
319 send_config->rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType;
320 send_config->rtp.ulpfec.red_rtx_payload_type = kRtxRedPayloadType;
321}
322
323void CallTest::SetReceiveUlpFecConfig(
Tommif6f45432022-05-20 15:21:20 +0200324 VideoReceiveStreamInterface::Config* receive_config) {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200325 receive_config->rtp.red_payload_type = kRedPayloadType;
326 receive_config->rtp.ulpfec_payload_type = kUlpfecPayloadType;
327 receive_config->rtp.rtx_associated_payload_types[kRtxRedPayloadType] =
328 kRedPayloadType;
329}
330
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +0100331void CallTest::CreateSendConfig(size_t num_video_streams,
332 size_t num_audio_streams,
333 size_t num_flexfec_streams,
334 Transport* send_transport) {
335 if (num_video_streams > 0) {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200336 video_send_configs_.clear();
337 video_send_configs_.emplace_back(nullptr);
338 CreateVideoSendConfig(&video_send_configs_.back(), num_video_streams, 0,
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +0100339 send_transport);
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100340 }
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +0100341 CreateAudioAndFecSendConfigs(num_audio_streams, num_flexfec_streams,
342 send_transport);
343}
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100344
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200345void CallTest::CreateMatchingVideoReceiveConfigs(
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +0100346 const VideoSendStream::Config& video_send_config,
347 Transport* rtcp_send_transport) {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200348 CreateMatchingVideoReceiveConfigs(video_send_config, rtcp_send_transport,
Per K92532402023-01-02 16:57:18 +0100349 &fake_decoder_factory_, absl::nullopt,
Niels Möllercbcbc222018-09-28 09:07:24 +0200350 false, 0);
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200351}
352
353void CallTest::CreateMatchingVideoReceiveConfigs(
354 const VideoSendStream::Config& video_send_config,
355 Transport* rtcp_send_transport,
Niels Möllercbcbc222018-09-28 09:07:24 +0200356 VideoDecoderFactory* decoder_factory,
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200357 absl::optional<size_t> decode_sub_stream,
358 bool receiver_reference_time_report,
359 int rtp_history_ms) {
360 AddMatchingVideoReceiveConfigs(
361 &video_receive_configs_, video_send_config, rtcp_send_transport,
Per K92532402023-01-02 16:57:18 +0100362 decoder_factory, decode_sub_stream, receiver_reference_time_report,
363 rtp_history_ms);
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200364}
365
366void CallTest::AddMatchingVideoReceiveConfigs(
Tommif6f45432022-05-20 15:21:20 +0200367 std::vector<VideoReceiveStreamInterface::Config>* receive_configs,
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200368 const VideoSendStream::Config& video_send_config,
369 Transport* rtcp_send_transport,
Niels Möllercbcbc222018-09-28 09:07:24 +0200370 VideoDecoderFactory* decoder_factory,
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200371 absl::optional<size_t> decode_sub_stream,
372 bool receiver_reference_time_report,
373 int rtp_history_ms) {
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +0100374 RTC_DCHECK(!video_send_config.rtp.ssrcs.empty());
Tommif6f45432022-05-20 15:21:20 +0200375 VideoReceiveStreamInterface::Config default_config(rtcp_send_transport);
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200376 default_config.rtp.local_ssrc = kReceiverLocalVideoSsrc;
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200377 default_config.rtp.nack.rtp_history_ms = rtp_history_ms;
378 // Enable RTT calculation so NTP time estimator will work.
379 default_config.rtp.rtcp_xr.receiver_reference_time_report =
380 receiver_reference_time_report;
381 default_config.renderer = &fake_renderer_;
382
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +0100383 for (size_t i = 0; i < video_send_config.rtp.ssrcs.size(); ++i) {
Tommif6f45432022-05-20 15:21:20 +0200384 VideoReceiveStreamInterface::Config video_recv_config(
385 default_config.Copy());
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200386 video_recv_config.decoders.clear();
387 if (!video_send_config.rtp.rtx.ssrcs.empty()) {
388 video_recv_config.rtp.rtx_ssrc = video_send_config.rtp.rtx.ssrcs[i];
389 video_recv_config.rtp.rtx_associated_payload_types[kSendRtxPayloadType] =
390 video_send_config.rtp.payload_type;
391 }
392 video_recv_config.rtp.remote_ssrc = video_send_config.rtp.ssrcs[i];
Tommif6f45432022-05-20 15:21:20 +0200393 VideoReceiveStreamInterface::Decoder decoder;
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200394
Niels Möllercbcbc222018-09-28 09:07:24 +0200395 decoder.payload_type = video_send_config.rtp.payload_type;
396 decoder.video_format = SdpVideoFormat(video_send_config.rtp.payload_name);
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200397 // Force fake decoders on non-selected simulcast streams.
398 if (!decode_sub_stream || i == *decode_sub_stream) {
Philip Eliasson2b068ce2020-08-03 15:55:10 +0000399 video_recv_config.decoder_factory = decoder_factory;
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200400 } else {
Philip Eliasson2b068ce2020-08-03 15:55:10 +0000401 video_recv_config.decoder_factory = &fake_decoder_factory_;
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200402 }
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200403 video_recv_config.decoders.push_back(decoder);
404 receive_configs->emplace_back(std::move(video_recv_config));
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +0100405 }
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +0100406}
407
408void CallTest::CreateMatchingAudioAndFecConfigs(
409 Transport* rtcp_send_transport) {
kwibergaf476c72016-11-28 15:21:39 -0800410 RTC_DCHECK_GE(1, num_audio_streams_);
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100411 if (num_audio_streams_ == 1) {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200412 CreateMatchingAudioConfigs(rtcp_send_transport, "");
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000413 }
brandtr841de6a2016-11-15 07:10:52 -0800414
415 // TODO(brandtr): Update this when we support multistream protection.
416 RTC_DCHECK(num_flexfec_streams_ <= 1);
417 if (num_flexfec_streams_ == 1) {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200418 CreateMatchingFecConfig(rtcp_send_transport, *GetVideoSendConfig());
brandtr841de6a2016-11-15 07:10:52 -0800419 }
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000420}
421
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200422void CallTest::CreateMatchingAudioConfigs(Transport* transport,
423 std::string sync_group) {
424 audio_receive_configs_.push_back(CreateMatchingAudioConfig(
425 audio_send_config_, audio_decoder_factory_, transport, sync_group));
426}
427
Tommi3176ef72022-05-22 20:47:28 +0200428AudioReceiveStreamInterface::Config CallTest::CreateMatchingAudioConfig(
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200429 const AudioSendStream::Config& send_config,
430 rtc::scoped_refptr<AudioDecoderFactory> audio_decoder_factory,
431 Transport* transport,
432 std::string sync_group) {
Tommi3176ef72022-05-22 20:47:28 +0200433 AudioReceiveStreamInterface::Config audio_config;
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200434 audio_config.rtp.local_ssrc = kReceiverLocalAudioSsrc;
435 audio_config.rtcp_send_transport = transport;
436 audio_config.rtp.remote_ssrc = send_config.rtp.ssrc;
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200437 audio_config.decoder_factory = audio_decoder_factory;
438 audio_config.decoder_map = {{kAudioSendPayloadType, {"opus", 48000, 2}}};
439 audio_config.sync_group = sync_group;
440 return audio_config;
441}
442
443void CallTest::CreateMatchingFecConfig(
444 Transport* transport,
445 const VideoSendStream::Config& send_config) {
446 FlexfecReceiveStream::Config config(transport);
447 config.payload_type = send_config.rtp.flexfec.payload_type;
Tommi1c1f5402021-06-14 10:54:20 +0200448 config.rtp.remote_ssrc = send_config.rtp.flexfec.ssrc;
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200449 config.protected_media_ssrcs = send_config.rtp.flexfec.protected_media_ssrcs;
Tommi1c1f5402021-06-14 10:54:20 +0200450 config.rtp.local_ssrc = kReceiverLocalVideoSsrc;
Tomas Gunnarsson8408c992021-02-14 14:19:12 +0100451 if (!video_receive_configs_.empty()) {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200452 video_receive_configs_[0].rtp.protected_by_flexfec = true;
Tomas Gunnarsson8408c992021-02-14 14:19:12 +0100453 video_receive_configs_[0].rtp.packet_sink_ = this;
454 }
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200455 flexfec_receive_configs_.push_back(config);
456}
457
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +0100458void CallTest::CreateMatchingReceiveConfigs(Transport* rtcp_send_transport) {
459 video_receive_configs_.clear();
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200460 for (VideoSendStream::Config& video_send_config : video_send_configs_) {
461 CreateMatchingVideoReceiveConfigs(video_send_config, rtcp_send_transport);
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +0100462 }
463 CreateMatchingAudioAndFecConfigs(rtcp_send_transport);
464}
465
danilchap9c6a0c72016-02-10 10:54:47 -0800466void CallTest::CreateFrameGeneratorCapturerWithDrift(Clock* clock,
perkjfa10b552016-10-02 23:45:26 -0700467 float speed,
468 int framerate,
469 int width,
470 int height) {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200471 video_sources_.clear();
Danil Chapovalova92e6242019-04-18 10:58:56 +0200472 auto frame_generator_capturer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200473 std::make_unique<test::FrameGeneratorCapturer>(
Danil Chapovalova92e6242019-04-18 10:58:56 +0200474 clock,
Artem Titov33f9d2b2019-12-05 15:59:00 +0100475 test::CreateSquareFrameGenerator(width, height, absl::nullopt,
476 absl::nullopt),
Danil Chapovalova92e6242019-04-18 10:58:56 +0200477 framerate * speed, *task_queue_factory_);
478 frame_generator_capturer_ = frame_generator_capturer.get();
479 frame_generator_capturer->Init();
480 video_sources_.push_back(std::move(frame_generator_capturer));
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200481 ConnectVideoSourcesToStreams();
danilchap9c6a0c72016-02-10 10:54:47 -0800482}
483
perkjfa10b552016-10-02 23:45:26 -0700484void CallTest::CreateFrameGeneratorCapturer(int framerate,
485 int width,
486 int height) {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200487 video_sources_.clear();
Danil Chapovalova92e6242019-04-18 10:58:56 +0200488 auto frame_generator_capturer =
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200489 std::make_unique<test::FrameGeneratorCapturer>(
Danil Chapovalova92e6242019-04-18 10:58:56 +0200490 clock_,
Artem Titov33f9d2b2019-12-05 15:59:00 +0100491 test::CreateSquareFrameGenerator(width, height, absl::nullopt,
492 absl::nullopt),
Danil Chapovalova92e6242019-04-18 10:58:56 +0200493 framerate, *task_queue_factory_);
494 frame_generator_capturer_ = frame_generator_capturer.get();
495 frame_generator_capturer->Init();
496 video_sources_.push_back(std::move(frame_generator_capturer));
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200497 ConnectVideoSourcesToStreams();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000498}
pbosf1828e82015-07-28 08:20:59 -0700499
oprypin92220ff2017-03-23 03:40:03 -0700500void CallTest::CreateFakeAudioDevices(
Artem Titov3faa8322018-03-07 14:44:00 +0100501 std::unique_ptr<TestAudioDeviceModule::Capturer> capturer,
502 std::unique_ptr<TestAudioDeviceModule::Renderer> renderer) {
Danil Chapovalov08fa9532019-06-12 11:49:17 +0000503 fake_send_audio_device_ = TestAudioDeviceModule::Create(
504 task_queue_factory_.get(), std::move(capturer), nullptr, 1.f);
505 fake_recv_audio_device_ = TestAudioDeviceModule::Create(
506 task_queue_factory_.get(), nullptr, std::move(renderer), 1.f);
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100507}
508
509void CallTest::CreateVideoStreams() {
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100510 RTC_DCHECK(video_receive_streams_.empty());
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200511 CreateVideoSendStreams();
stefanff483612015-12-21 03:14:00 -0800512 for (size_t i = 0; i < video_receive_configs_.size(); ++i) {
Tommi733b5472016-06-10 17:58:01 +0200513 video_receive_streams_.push_back(receiver_call_->CreateVideoReceiveStream(
514 video_receive_configs_[i].Copy()));
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000515 }
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000516}
517
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200518void CallTest::CreateVideoSendStreams() {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200519 RTC_DCHECK(video_send_streams_.empty());
520
521 // We currently only support testing external fec controllers with a single
522 // VideoSendStream.
523 if (fec_controller_factory_.get()) {
524 RTC_DCHECK_LE(video_send_configs_.size(), 1);
525 }
526
527 // TODO(http://crbug/818127):
528 // Remove this workaround when ALR is not screenshare-specific.
529 std::list<size_t> streams_creation_order;
530 for (size_t i = 0; i < video_send_configs_.size(); ++i) {
531 // If dual streams are created, add the screenshare stream last.
532 if (video_encoder_configs_[i].content_type ==
533 VideoEncoderConfig::ContentType::kScreen) {
534 streams_creation_order.push_back(i);
535 } else {
536 streams_creation_order.push_front(i);
537 }
538 }
539
540 video_send_streams_.resize(video_send_configs_.size(), nullptr);
541
542 for (size_t i : streams_creation_order) {
543 if (fec_controller_factory_.get()) {
544 video_send_streams_[i] = sender_call_->CreateVideoSendStream(
545 video_send_configs_[i].Copy(), video_encoder_configs_[i].Copy(),
546 fec_controller_factory_->CreateFecController());
547 } else {
548 video_send_streams_[i] = sender_call_->CreateVideoSendStream(
549 video_send_configs_[i].Copy(), video_encoder_configs_[i].Copy());
550 }
551 }
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200552}
553
554void CallTest::CreateVideoSendStream(const VideoEncoderConfig& encoder_config) {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200555 RTC_DCHECK(video_send_streams_.empty());
556 video_send_streams_.push_back(sender_call_->CreateVideoSendStream(
557 GetVideoSendConfig()->Copy(), encoder_config.Copy()));
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200558}
559
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100560void CallTest::CreateAudioStreams() {
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +0100561 RTC_DCHECK(audio_send_stream_ == nullptr);
562 RTC_DCHECK(audio_receive_streams_.empty());
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100563 audio_send_stream_ = sender_call_->CreateAudioSendStream(audio_send_config_);
564 for (size_t i = 0; i < audio_receive_configs_.size(); ++i) {
565 audio_receive_streams_.push_back(
566 receiver_call_->CreateAudioReceiveStream(audio_receive_configs_[i]));
567 }
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100568}
569
brandtr841de6a2016-11-15 07:10:52 -0800570void CallTest::CreateFlexfecStreams() {
571 for (size_t i = 0; i < flexfec_receive_configs_.size(); ++i) {
572 flexfec_receive_streams_.push_back(
573 receiver_call_->CreateFlexfecReceiveStream(
574 flexfec_receive_configs_[i]));
575 }
eladalonc0d481a2017-08-02 07:39:07 -0700576}
577
Per Kjellander89870ff2023-01-19 15:45:58 +0000578void CallTest::CreateSendTransport(const BuiltInNetworkBehaviorConfig& config,
579 RtpRtcpObserver* observer) {
580 PacketReceiver* receiver =
581 receiver_call_ ? receiver_call_->Receiver() : nullptr;
582
583 auto network = std::make_unique<SimulatedNetwork>(config);
584 send_simulated_network_ = network.get();
585 send_transport_ = std::make_unique<PacketTransport>(
586 task_queue(), sender_call_.get(), observer,
587 test::PacketTransport::kSender, payload_type_map_,
588 std::make_unique<FakeNetworkPipe>(Clock::GetRealTimeClock(),
589 std::move(network), receiver),
590 rtp_extensions_, rtp_extensions_);
591}
592
593void CallTest::CreateReceiveTransport(
594 const BuiltInNetworkBehaviorConfig& config,
595 RtpRtcpObserver* observer) {
596 auto network = std::make_unique<SimulatedNetwork>(config);
597 receive_simulated_network_ = network.get();
598 receive_transport_ = std::make_unique<PacketTransport>(
599 task_queue(), nullptr, observer, test::PacketTransport::kReceiver,
600 payload_type_map_,
601 std::make_unique<FakeNetworkPipe>(Clock::GetRealTimeClock(),
602 std::move(network),
603 sender_call_->Receiver()),
604 rtp_extensions_, rtp_extensions_);
605}
606
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200607void CallTest::ConnectVideoSourcesToStreams() {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200608 for (size_t i = 0; i < video_sources_.size(); ++i)
Niels Möller1c931c42018-12-18 16:08:11 +0100609 video_send_streams_[i]->SetSource(video_sources_[i].get(),
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200610 degradation_preference_);
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200611}
612
eladalon445f1a12017-08-09 01:52:36 -0700613void CallTest::Start() {
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200614 StartVideoStreams();
eladalon445f1a12017-08-09 01:52:36 -0700615 if (audio_send_stream_) {
616 audio_send_stream_->Start();
617 }
Tommi3176ef72022-05-22 20:47:28 +0200618 for (AudioReceiveStreamInterface* audio_recv_stream : audio_receive_streams_)
eladalon445f1a12017-08-09 01:52:36 -0700619 audio_recv_stream->Start();
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200620}
621
622void CallTest::StartVideoStreams() {
Per Kjellander59ade012022-12-02 08:09:37 +0000623 for (size_t i = 0; i < video_send_streams_.size(); ++i) {
624 std::vector<bool> active_rtp_streams(
625 video_send_configs_[i].rtp.ssrcs.size(), true);
626 video_send_streams_[i]->StartPerRtpStream(active_rtp_streams);
627 }
Tommif6f45432022-05-20 15:21:20 +0200628 for (VideoReceiveStreamInterface* video_recv_stream : video_receive_streams_)
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200629 video_recv_stream->Start();
630}
631
eladalon445f1a12017-08-09 01:52:36 -0700632void CallTest::Stop() {
Tommi3176ef72022-05-22 20:47:28 +0200633 for (AudioReceiveStreamInterface* audio_recv_stream : audio_receive_streams_)
eladalon445f1a12017-08-09 01:52:36 -0700634 audio_recv_stream->Stop();
635 if (audio_send_stream_) {
636 audio_send_stream_->Stop();
637 }
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200638 StopVideoStreams();
639}
640
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200641void CallTest::StopVideoStreams() {
642 for (VideoSendStream* video_send_stream : video_send_streams_)
643 video_send_stream->Stop();
Tommif6f45432022-05-20 15:21:20 +0200644 for (VideoReceiveStreamInterface* video_recv_stream : video_receive_streams_)
eladalon445f1a12017-08-09 01:52:36 -0700645 video_recv_stream->Stop();
eladalon445f1a12017-08-09 01:52:36 -0700646}
647
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000648void CallTest::DestroyStreams() {
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100649 if (audio_send_stream_)
650 sender_call_->DestroyAudioSendStream(audio_send_stream_);
651 audio_send_stream_ = nullptr;
Tommi3176ef72022-05-22 20:47:28 +0200652 for (AudioReceiveStreamInterface* audio_recv_stream : audio_receive_streams_)
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100653 receiver_call_->DestroyAudioReceiveStream(audio_recv_stream);
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100654
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200655 DestroyVideoSendStreams();
ilnika014cc52017-03-07 04:21:04 -0800656
Tommif6f45432022-05-20 15:21:20 +0200657 for (VideoReceiveStreamInterface* video_recv_stream : video_receive_streams_)
brandtrfb45c6c2017-01-27 06:47:55 -0800658 receiver_call_->DestroyVideoReceiveStream(video_recv_stream);
659
brandtr841de6a2016-11-15 07:10:52 -0800660 for (FlexfecReceiveStream* flexfec_recv_stream : flexfec_receive_streams_)
661 receiver_call_->DestroyFlexfecReceiveStream(flexfec_recv_stream);
662
663 video_receive_streams_.clear();
Niels Möller3b819f32019-10-10 12:42:41 +0200664 video_sources_.clear();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000665}
666
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200667void CallTest::DestroyVideoSendStreams() {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200668 for (VideoSendStream* video_send_stream : video_send_streams_)
669 sender_call_->DestroyVideoSendStream(video_send_stream);
670 video_send_streams_.clear();
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200671}
672
eladalon445f1a12017-08-09 01:52:36 -0700673void CallTest::SetFakeVideoCaptureRotation(VideoRotation rotation) {
674 frame_generator_capturer_->SetFakeRotation(rotation);
675}
676
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200677void CallTest::SetVideoDegradation(DegradationPreference preference) {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200678 GetVideoSendStream()->SetSource(frame_generator_capturer_, preference);
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200679}
680
681VideoSendStream::Config* CallTest::GetVideoSendConfig() {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200682 return &video_send_configs_[0];
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200683}
684
685void CallTest::SetVideoSendConfig(const VideoSendStream::Config& config) {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200686 video_send_configs_.clear();
687 video_send_configs_.push_back(config.Copy());
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200688}
689
690VideoEncoderConfig* CallTest::GetVideoEncoderConfig() {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200691 return &video_encoder_configs_[0];
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200692}
693
694void CallTest::SetVideoEncoderConfig(const VideoEncoderConfig& config) {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200695 video_encoder_configs_.clear();
696 video_encoder_configs_.push_back(config.Copy());
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200697}
698
699VideoSendStream* CallTest::GetVideoSendStream() {
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200700 return video_send_streams_[0];
701}
702FlexfecReceiveStream::Config* CallTest::GetFlexFecConfig() {
703 return &flexfec_receive_configs_[0];
Sebastian Janssonf33905d2018-07-13 09:49:00 +0200704}
705
Tomas Gunnarsson8408c992021-02-14 14:19:12 +0100706void CallTest::OnRtpPacket(const RtpPacketReceived& packet) {
707 // All FlexFEC streams protect all of the video streams.
708 for (FlexfecReceiveStream* flexfec_recv_stream : flexfec_receive_streams_)
709 flexfec_recv_stream->OnRtpPacket(packet);
710}
711
Elad Alond8d32482019-02-18 23:45:57 +0100712absl::optional<RtpExtension> CallTest::GetRtpExtensionByUri(
713 const std::string& uri) const {
714 for (const auto& extension : rtp_extensions_) {
715 if (extension.uri == uri) {
716 return extension;
717 }
718 }
719 return absl::nullopt;
720}
721
722void CallTest::AddRtpExtensionByUri(
723 const std::string& uri,
724 std::vector<RtpExtension>* extensions) const {
725 const absl::optional<RtpExtension> extension = GetRtpExtensionByUri(uri);
726 if (extension) {
727 extensions->push_back(*extension);
728 }
729}
730
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +0100731constexpr size_t CallTest::kNumSsrcs;
perkjfa10b552016-10-02 23:45:26 -0700732const int CallTest::kDefaultWidth;
733const int CallTest::kDefaultHeight;
734const int CallTest::kDefaultFramerate;
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +0100735const uint32_t CallTest::kSendRtxSsrcs[kNumSsrcs] = {
736 0xBADCAFD, 0xBADCAFE, 0xBADCAFF, 0xBADCB00, 0xBADCB01, 0xBADCB02};
737const uint32_t CallTest::kVideoSendSsrcs[kNumSsrcs] = {
738 0xC0FFED, 0xC0FFEE, 0xC0FFEF, 0xC0FFF0, 0xC0FFF1, 0xC0FFF2};
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100739const uint32_t CallTest::kAudioSendSsrc = 0xDEADBEEF;
brandtr841de6a2016-11-15 07:10:52 -0800740const uint32_t CallTest::kFlexfecSendSsrc = 0xBADBEEF;
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100741const uint32_t CallTest::kReceiverLocalVideoSsrc = 0x123456;
742const uint32_t CallTest::kReceiverLocalAudioSsrc = 0x1234567;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000743const int CallTest::kNackRtpHistoryMs = 1000;
744
minyue20c84cc2017-04-10 16:57:57 -0700745const std::map<uint8_t, MediaType> CallTest::payload_type_map_ = {
746 {CallTest::kVideoSendPayloadType, MediaType::VIDEO},
747 {CallTest::kFakeVideoSendPayloadType, MediaType::VIDEO},
748 {CallTest::kSendRtxPayloadType, MediaType::VIDEO},
Per Kjellander89870ff2023-01-19 15:45:58 +0000749 {CallTest::kPayloadTypeVP8, MediaType::VIDEO},
750 {CallTest::kPayloadTypeVP9, MediaType::VIDEO},
751 {CallTest::kPayloadTypeH264, MediaType::VIDEO},
752 {CallTest::kPayloadTypeGeneric, MediaType::VIDEO},
minyue20c84cc2017-04-10 16:57:57 -0700753 {CallTest::kRedPayloadType, MediaType::VIDEO},
754 {CallTest::kRtxRedPayloadType, MediaType::VIDEO},
755 {CallTest::kUlpfecPayloadType, MediaType::VIDEO},
756 {CallTest::kFlexfecPayloadType, MediaType::VIDEO},
Sebastian Janssond155d682019-03-04 18:59:32 +0100757 {CallTest::kAudioSendPayloadType, MediaType::AUDIO}};
minyue20c84cc2017-04-10 16:57:57 -0700758
Sebastian Jansson72582242018-07-13 13:19:42 +0200759BaseTest::BaseTest() {}
philipele828c962017-03-21 03:24:27 -0700760
Markus Handellf4f22872022-08-16 11:02:45 +0000761BaseTest::BaseTest(TimeDelta timeout) : RtpRtcpObserver(timeout) {}
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000762
Yves Gerey665174f2018-06-19 15:03:05 +0200763BaseTest::~BaseTest() {}
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000764
Artem Titov3faa8322018-03-07 14:44:00 +0100765std::unique_ptr<TestAudioDeviceModule::Capturer> BaseTest::CreateCapturer() {
766 return TestAudioDeviceModule::CreatePulsedNoiseCapturer(256, 48000);
oprypin92220ff2017-03-23 03:40:03 -0700767}
768
Artem Titov3faa8322018-03-07 14:44:00 +0100769std::unique_ptr<TestAudioDeviceModule::Renderer> BaseTest::CreateRenderer() {
770 return TestAudioDeviceModule::CreateDiscardRenderer(48000);
oprypin92220ff2017-03-23 03:40:03 -0700771}
772
Artem Titov3faa8322018-03-07 14:44:00 +0100773void BaseTest::OnFakeAudioDevicesCreated(
774 TestAudioDeviceModule* send_audio_device,
775 TestAudioDeviceModule* recv_audio_device) {}
oprypin92220ff2017-03-23 03:40:03 -0700776
Niels Möllerde8e6e62018-11-13 15:10:33 +0100777void BaseTest::ModifySenderBitrateConfig(BitrateConstraints* bitrate_config) {}
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000778
Niels Möllerde8e6e62018-11-13 15:10:33 +0100779void BaseTest::ModifyReceiverBitrateConfig(BitrateConstraints* bitrate_config) {
780}
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000781
Yves Gerey665174f2018-06-19 15:03:05 +0200782void BaseTest::OnCallsCreated(Call* sender_call, Call* receiver_call) {}
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000783
Per Kjellander89870ff2023-01-19 15:45:58 +0000784void BaseTest::OnTransportCreated(PacketTransport* to_receiver,
785 SimulatedNetworkInterface* sender_network,
786 PacketTransport* to_sender,
787 SimulatedNetworkInterface* receiver_network) {
stefane74eef12016-01-08 06:47:13 -0800788}
789
Per Kjellander89870ff2023-01-19 15:45:58 +0000790BuiltInNetworkBehaviorConfig BaseTest::GetSendTransportConfig() const {
791 return BuiltInNetworkBehaviorConfig();
stefane74eef12016-01-08 06:47:13 -0800792}
Per Kjellander89870ff2023-01-19 15:45:58 +0000793BuiltInNetworkBehaviorConfig BaseTest::GetReceiveTransportConfig() const {
794 return BuiltInNetworkBehaviorConfig();
795}
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100796size_t BaseTest::GetNumVideoStreams() const {
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000797 return 1;
798}
799
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100800size_t BaseTest::GetNumAudioStreams() const {
801 return 0;
802}
803
brandtr841de6a2016-11-15 07:10:52 -0800804size_t BaseTest::GetNumFlexfecStreams() const {
805 return 0;
806}
807
stefanff483612015-12-21 03:14:00 -0800808void BaseTest::ModifyVideoConfigs(
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000809 VideoSendStream::Config* send_config,
Tommif6f45432022-05-20 15:21:20 +0200810 std::vector<VideoReceiveStreamInterface::Config>* receive_configs,
stefanff483612015-12-21 03:14:00 -0800811 VideoEncoderConfig* encoder_config) {}
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000812
perkjfa10b552016-10-02 23:45:26 -0700813void BaseTest::ModifyVideoCaptureStartResolution(int* width,
814 int* heigt,
815 int* frame_rate) {}
816
Åsa Perssoncb7eddb2018-11-05 14:11:44 +0100817void BaseTest::ModifyVideoDegradationPreference(
818 DegradationPreference* degradation_preference) {}
819
stefanff483612015-12-21 03:14:00 -0800820void BaseTest::OnVideoStreamsCreated(
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000821 VideoSendStream* send_stream,
Tommif6f45432022-05-20 15:21:20 +0200822 const std::vector<VideoReceiveStreamInterface*>& receive_streams) {}
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000823
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100824void BaseTest::ModifyAudioConfigs(
825 AudioSendStream::Config* send_config,
Tommi3176ef72022-05-22 20:47:28 +0200826 std::vector<AudioReceiveStreamInterface::Config>* receive_configs) {}
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100827
828void BaseTest::OnAudioStreamsCreated(
829 AudioSendStream* send_stream,
Tommi3176ef72022-05-22 20:47:28 +0200830 const std::vector<AudioReceiveStreamInterface*>& receive_streams) {}
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100831
brandtr841de6a2016-11-15 07:10:52 -0800832void BaseTest::ModifyFlexfecConfigs(
833 std::vector<FlexfecReceiveStream::Config>* receive_configs) {}
834
835void BaseTest::OnFlexfecStreamsCreated(
836 const std::vector<FlexfecReceiveStream*>& receive_streams) {}
837
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000838void BaseTest::OnFrameGeneratorCapturerCreated(
Yves Gerey665174f2018-06-19 15:03:05 +0200839 FrameGeneratorCapturer* frame_generator_capturer) {}
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000840
Yves Gerey665174f2018-06-19 15:03:05 +0200841void BaseTest::OnStreamsStopped() {}
oprypin92220ff2017-03-23 03:40:03 -0700842
Markus Handellf4f22872022-08-16 11:02:45 +0000843SendTest::SendTest(TimeDelta timeout) : BaseTest(timeout) {}
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000844
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000845bool SendTest::ShouldCreateReceivers() const {
846 return false;
847}
848
philipele828c962017-03-21 03:24:27 -0700849EndToEndTest::EndToEndTest() {}
850
Markus Handellf4f22872022-08-16 11:02:45 +0000851EndToEndTest::EndToEndTest(TimeDelta timeout) : BaseTest(timeout) {}
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000852
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000853bool EndToEndTest::ShouldCreateReceivers() const {
854 return true;
855}
856
857} // namespace test
858} // namespace webrtc