blob: 5c60895d394ec5e94b08f456393cec48105ce4ce [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
11#include "webrtc/test/call_test.h"
12
13#include <algorithm>
14
kwiberg087bd342017-02-10 08:15:44 -080015#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h"
Stefan Holmer9fea80f2016-01-07 17:43:18 +010016#include "webrtc/base/checks.h"
Stefan Holmer9fea80f2016-01-07 17:43:18 +010017#include "webrtc/config.h"
aleloi10111bc2016-11-17 06:48:48 -080018#include "webrtc/modules/audio_mixer/audio_mixer_impl.h"
Stefan Holmer9fea80f2016-01-07 17:43:18 +010019#include "webrtc/test/testsupport/fileutils.h"
20#include "webrtc/voice_engine/include/voe_base.h"
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000021
22namespace webrtc {
23namespace test {
24
Guo-wei Shieh2c370782015-04-08 13:00:10 -070025namespace {
26const int kVideoRotationRtpExtensionId = 4;
27}
28
nissee5ad5ca2017-03-29 23:57:43 -070029void CallTest::PayloadDemuxer::SetReceiver(PacketReceiver* receiver) {
30 receiver_ = receiver;
31}
32
33PacketReceiver::DeliveryStatus CallTest::PayloadDemuxer::DeliverPacket(
34 MediaType media_type,
35 const uint8_t* packet,
36 size_t length,
37 const PacketTime& packet_time) {
38 if (media_type == MediaType::ANY) {
39 // This simplistic demux logic will not make much sense for RTCP
40 // packets, but it seems that doesn't matter.
41 RTC_CHECK_GE(length, 2);
42 uint8_t pt = packet[1] & 0x7f;
43 if (pt == kFakeVideoSendPayloadType || pt == kFlexfecPayloadType) {
44 media_type = MediaType::VIDEO;
45 } else {
46 media_type = MediaType::AUDIO;
47 }
48 }
49 return receiver_->DeliverPacket(media_type, packet, length, packet_time);
50}
51
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000052CallTest::CallTest()
pbos@webrtc.org2bb1bda2014-07-07 13:06:48 +000053 : clock_(Clock::GetRealTimeClock()),
philipel4fb651d2017-04-10 03:54:05 -070054 event_log_(RtcEventLog::CreateNull()),
stefanff483612015-12-21 03:14:00 -080055 video_send_config_(nullptr),
Stefan Holmer9fea80f2016-01-07 17:43:18 +010056 video_send_stream_(nullptr),
57 audio_send_config_(nullptr),
58 audio_send_stream_(nullptr),
59 fake_encoder_(clock_),
Stefan Holmer04cb7632016-01-14 20:34:30 +010060 num_video_streams_(1),
Stefan Holmer9fea80f2016-01-07 17:43:18 +010061 num_audio_streams_(0),
brandtr841de6a2016-11-15 07:10:52 -080062 num_flexfec_streams_(0),
ossu29b1a8d2016-06-13 07:34:51 -070063 decoder_factory_(CreateBuiltinAudioDecoderFactory()),
Stefan Holmer9fea80f2016-01-07 17:43:18 +010064 fake_send_audio_device_(nullptr),
65 fake_recv_audio_device_(nullptr) {}
pbos@webrtc.org32452b22014-10-22 12:15:24 +000066
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000067CallTest::~CallTest() {
68}
69
stefane74eef12016-01-08 06:47:13 -080070void CallTest::RunBaseTest(BaseTest* test) {
Stefan Holmer9fea80f2016-01-07 17:43:18 +010071 num_video_streams_ = test->GetNumVideoStreams();
72 num_audio_streams_ = test->GetNumAudioStreams();
brandtr841de6a2016-11-15 07:10:52 -080073 num_flexfec_streams_ = test->GetNumFlexfecStreams();
Stefan Holmer9fea80f2016-01-07 17:43:18 +010074 RTC_DCHECK(num_video_streams_ > 0 || num_audio_streams_ > 0);
75 Call::Config send_config(test->GetSenderCallConfig());
76 if (num_audio_streams_ > 0) {
oprypin92220ff2017-03-23 03:40:03 -070077 CreateFakeAudioDevices(test->CreateCapturer(), test->CreateRenderer());
78 test->OnFakeAudioDevicesCreated(fake_send_audio_device_.get(),
79 fake_recv_audio_device_.get());
Stefan Holmer9fea80f2016-01-07 17:43:18 +010080 CreateVoiceEngines();
81 AudioState::Config audio_state_config;
82 audio_state_config.voice_engine = voe_send_.voice_engine;
aleloi10111bc2016-11-17 06:48:48 -080083 audio_state_config.audio_mixer = AudioMixerImpl::Create();
Stefan Holmer9fea80f2016-01-07 17:43:18 +010084 send_config.audio_state = AudioState::Create(audio_state_config);
85 }
86 CreateSenderCall(send_config);
87 if (test->ShouldCreateReceivers()) {
88 Call::Config recv_config(test->GetReceiverCallConfig());
89 if (num_audio_streams_ > 0) {
90 AudioState::Config audio_state_config;
91 audio_state_config.voice_engine = voe_recv_.voice_engine;
aleloi10111bc2016-11-17 06:48:48 -080092 audio_state_config.audio_mixer = AudioMixerImpl::Create();
Stefan Holmer9fea80f2016-01-07 17:43:18 +010093 recv_config.audio_state = AudioState::Create(audio_state_config);
94 }
95 CreateReceiverCall(recv_config);
96 }
Stefan Holmer04cb7632016-01-14 20:34:30 +010097 test->OnCallsCreated(sender_call_.get(), receiver_call_.get());
stefane74eef12016-01-08 06:47:13 -080098 receive_transport_.reset(test->CreateReceiveTransport());
mflodman86cc6ff2016-07-26 04:44:06 -070099 send_transport_.reset(test->CreateSendTransport(sender_call_.get()));
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000100
101 if (test->ShouldCreateReceivers()) {
nissee5ad5ca2017-03-29 23:57:43 -0700102 // For tests using only video or only audio, we rely on each test
103 // configuring the underlying FakeNetworkPipe with the right media
104 // type. But for tests sending both video and audio over the same
105 // FakeNetworkPipe, we need to "demux", i.e., setting the
106 // MediaType based on RTP payload type.
107 if (num_video_streams_ > 0 && num_audio_streams_ > 0) {
108 receive_demuxer_.SetReceiver(receiver_call_->Receiver());
109 send_transport_->SetReceiver(&receive_demuxer_);
110 send_demuxer_.SetReceiver(sender_call_->Receiver());
111 receive_transport_->SetReceiver(&send_demuxer_);
112 } else {
113 send_transport_->SetReceiver(receiver_call_->Receiver());
114 receive_transport_->SetReceiver(sender_call_->Receiver());
115 }
Sergey Ulanove2b15012016-11-22 16:08:30 -0800116 if (num_video_streams_ > 0)
117 receiver_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp);
118 if (num_audio_streams_ > 0)
119 receiver_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkUp);
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000120 } else {
121 // Sender-only call delivers to itself.
stefanf116bd02015-10-27 08:29:42 -0700122 send_transport_->SetReceiver(sender_call_->Receiver());
123 receive_transport_->SetReceiver(nullptr);
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000124 }
125
brandtr841de6a2016-11-15 07:10:52 -0800126 CreateSendConfig(num_video_streams_, num_audio_streams_, num_flexfec_streams_,
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100127 send_transport_.get());
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000128 if (test->ShouldCreateReceivers()) {
stefanf116bd02015-10-27 08:29:42 -0700129 CreateMatchingReceiveConfigs(receive_transport_.get());
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000130 }
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100131 if (num_video_streams_ > 0) {
132 test->ModifyVideoConfigs(&video_send_config_, &video_receive_configs_,
133 &video_encoder_config_);
134 }
brandtr841de6a2016-11-15 07:10:52 -0800135 if (num_audio_streams_ > 0) {
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100136 test->ModifyAudioConfigs(&audio_send_config_, &audio_receive_configs_);
brandtr841de6a2016-11-15 07:10:52 -0800137 }
138 if (num_flexfec_streams_ > 0) {
139 test->ModifyFlexfecConfigs(&flexfec_receive_configs_);
140 }
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100141
brandtrfb45c6c2017-01-27 06:47:55 -0800142 if (num_flexfec_streams_ > 0) {
143 CreateFlexfecStreams();
144 test->OnFlexfecStreamsCreated(flexfec_receive_streams_);
145 }
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100146 if (num_video_streams_ > 0) {
147 CreateVideoStreams();
148 test->OnVideoStreamsCreated(video_send_stream_, video_receive_streams_);
149 }
150 if (num_audio_streams_ > 0) {
151 CreateAudioStreams();
152 test->OnAudioStreamsCreated(audio_send_stream_, audio_receive_streams_);
153 }
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000154
Stefan Holmer04cb7632016-01-14 20:34:30 +0100155 if (num_video_streams_ > 0) {
perkjfa10b552016-10-02 23:45:26 -0700156 int width = kDefaultWidth;
157 int height = kDefaultHeight;
158 int frame_rate = kDefaultFramerate;
159 test->ModifyVideoCaptureStartResolution(&width, &height, &frame_rate);
160 CreateFrameGeneratorCapturer(frame_rate, width, height);
Stefan Holmer04cb7632016-01-14 20:34:30 +0100161 test->OnFrameGeneratorCapturerCreated(frame_generator_capturer_.get());
162 }
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000163
164 Start();
165 test->PerformTest();
stefanf116bd02015-10-27 08:29:42 -0700166 send_transport_->StopSending();
167 receive_transport_->StopSending();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000168 Stop();
169
170 DestroyStreams();
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100171 DestroyCalls();
172 if (num_audio_streams_ > 0)
173 DestroyVoiceEngines();
oprypin92220ff2017-03-23 03:40:03 -0700174
175 test->OnTestFinished();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000176}
177
178void CallTest::Start() {
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100179 if (video_send_stream_)
180 video_send_stream_->Start();
181 for (VideoReceiveStream* video_recv_stream : video_receive_streams_)
182 video_recv_stream->Start();
183 if (audio_send_stream_) {
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100184 audio_send_stream_->Start();
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100185 }
186 for (AudioReceiveStream* audio_recv_stream : audio_receive_streams_)
187 audio_recv_stream->Start();
brandtr841de6a2016-11-15 07:10:52 -0800188 for (FlexfecReceiveStream* flexfec_recv_stream : flexfec_receive_streams_)
189 flexfec_recv_stream->Start();
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000190 if (frame_generator_capturer_.get() != NULL)
191 frame_generator_capturer_->Start();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000192}
193
194void CallTest::Stop() {
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000195 if (frame_generator_capturer_.get() != NULL)
196 frame_generator_capturer_->Stop();
brandtr841de6a2016-11-15 07:10:52 -0800197 for (FlexfecReceiveStream* flexfec_recv_stream : flexfec_receive_streams_)
198 flexfec_recv_stream->Stop();
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100199 for (AudioReceiveStream* audio_recv_stream : audio_receive_streams_)
200 audio_recv_stream->Stop();
201 if (audio_send_stream_) {
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100202 audio_send_stream_->Stop();
203 }
204 for (VideoReceiveStream* video_recv_stream : video_receive_streams_)
205 video_recv_stream->Stop();
206 if (video_send_stream_)
207 video_send_stream_->Stop();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000208}
209
210void CallTest::CreateCalls(const Call::Config& sender_config,
211 const Call::Config& receiver_config) {
212 CreateSenderCall(sender_config);
213 CreateReceiverCall(receiver_config);
214}
215
216void CallTest::CreateSenderCall(const Call::Config& config) {
217 sender_call_.reset(Call::Create(config));
218}
219
220void CallTest::CreateReceiverCall(const Call::Config& config) {
221 receiver_call_.reset(Call::Create(config));
222}
223
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200224void CallTest::DestroyCalls() {
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100225 sender_call_.reset();
226 receiver_call_.reset();
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200227}
228
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100229void CallTest::CreateSendConfig(size_t num_video_streams,
230 size_t num_audio_streams,
brandtr841de6a2016-11-15 07:10:52 -0800231 size_t num_flexfec_streams,
pbos2d566682015-09-28 09:59:31 -0700232 Transport* send_transport) {
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100233 RTC_DCHECK(num_video_streams <= kNumSsrcs);
kwibergaf476c72016-11-28 15:21:39 -0800234 RTC_DCHECK_LE(num_audio_streams, 1);
235 RTC_DCHECK_LE(num_flexfec_streams, 1);
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100236 RTC_DCHECK(num_audio_streams == 0 || voe_send_.channel_id >= 0);
Stefan Holmer04cb7632016-01-14 20:34:30 +0100237 if (num_video_streams > 0) {
238 video_send_config_ = VideoSendStream::Config(send_transport);
239 video_send_config_.encoder_settings.encoder = &fake_encoder_;
240 video_send_config_.encoder_settings.payload_name = "FAKE";
241 video_send_config_.encoder_settings.payload_type =
242 kFakeVideoSendPayloadType;
243 video_send_config_.rtp.extensions.push_back(
stefanb77c7162017-02-06 06:29:38 -0800244 RtpExtension(RtpExtension::kTransportSequenceNumberUri,
245 kTransportSequenceNumberExtensionId));
perkjfa10b552016-10-02 23:45:26 -0700246 FillEncoderConfiguration(num_video_streams, &video_encoder_config_);
247
Stefan Holmer04cb7632016-01-14 20:34:30 +0100248 for (size_t i = 0; i < num_video_streams; ++i)
249 video_send_config_.rtp.ssrcs.push_back(kVideoSendSsrcs[i]);
250 video_send_config_.rtp.extensions.push_back(RtpExtension(
isheriff6f8d6862016-05-26 11:24:55 -0700251 RtpExtension::kVideoRotationUri, kVideoRotationRtpExtensionId));
Stefan Holmer04cb7632016-01-14 20:34:30 +0100252 }
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100253
254 if (num_audio_streams > 0) {
255 audio_send_config_ = AudioSendStream::Config(send_transport);
256 audio_send_config_.voe_channel_id = voe_send_.channel_id;
257 audio_send_config_.rtp.ssrc = kAudioSendSsrc;
solenberg68e6bdd2016-10-27 00:23:06 -0700258 audio_send_config_.send_codec_spec.codec_inst =
philipel5ef2bc12017-02-21 07:28:31 -0800259 CodecInst{kAudioSendPayloadType, "OPUS", 48000, 960, 2, 64000};
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100260 }
brandtr841de6a2016-11-15 07:10:52 -0800261
262 // TODO(brandtr): Update this when we support multistream protection.
263 if (num_flexfec_streams > 0) {
brandtr3d200bd2017-01-16 06:59:19 -0800264 video_send_config_.rtp.flexfec.payload_type = kFlexfecPayloadType;
265 video_send_config_.rtp.flexfec.ssrc = kFlexfecSendSsrc;
brandtr841de6a2016-11-15 07:10:52 -0800266 video_send_config_.rtp.flexfec.protected_media_ssrcs = {kVideoSendSsrcs[0]};
267 }
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000268}
269
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100270void CallTest::CreateMatchingReceiveConfigs(Transport* rtcp_send_transport) {
philipel8a256522017-03-30 05:06:22 -0700271 video_receive_configs_.clear();
272 allocated_decoders_.clear();
Stefan Holmer04cb7632016-01-14 20:34:30 +0100273 if (num_video_streams_ > 0) {
274 RTC_DCHECK(!video_send_config_.rtp.ssrcs.empty());
275 VideoReceiveStream::Config video_config(rtcp_send_transport);
stefanb77c7162017-02-06 06:29:38 -0800276 video_config.rtp.remb = false;
277 video_config.rtp.transport_cc = true;
Stefan Holmer04cb7632016-01-14 20:34:30 +0100278 video_config.rtp.local_ssrc = kReceiverLocalVideoSsrc;
279 for (const RtpExtension& extension : video_send_config_.rtp.extensions)
280 video_config.rtp.extensions.push_back(extension);
sakal55d932b2016-09-30 06:19:08 -0700281 video_config.renderer = &fake_renderer_;
Stefan Holmer04cb7632016-01-14 20:34:30 +0100282 for (size_t i = 0; i < video_send_config_.rtp.ssrcs.size(); ++i) {
283 VideoReceiveStream::Decoder decoder =
284 test::CreateMatchingDecoder(video_send_config_.encoder_settings);
kwiberg4a206a92016-03-31 10:24:26 -0700285 allocated_decoders_.push_back(
286 std::unique_ptr<VideoDecoder>(decoder.decoder));
Stefan Holmer04cb7632016-01-14 20:34:30 +0100287 video_config.decoders.clear();
288 video_config.decoders.push_back(decoder);
289 video_config.rtp.remote_ssrc = video_send_config_.rtp.ssrcs[i];
Tommi733b5472016-06-10 17:58:01 +0200290 video_receive_configs_.push_back(video_config.Copy());
Stefan Holmer04cb7632016-01-14 20:34:30 +0100291 }
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100292 }
293
kwibergaf476c72016-11-28 15:21:39 -0800294 RTC_DCHECK_GE(1, num_audio_streams_);
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100295 if (num_audio_streams_ == 1) {
solenberg68e6bdd2016-10-27 00:23:06 -0700296 RTC_DCHECK_LE(0, voe_send_.channel_id);
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100297 AudioReceiveStream::Config audio_config;
298 audio_config.rtp.local_ssrc = kReceiverLocalAudioSsrc;
299 audio_config.rtcp_send_transport = rtcp_send_transport;
300 audio_config.voe_channel_id = voe_recv_.channel_id;
301 audio_config.rtp.remote_ssrc = audio_send_config_.rtp.ssrc;
ossu29b1a8d2016-06-13 07:34:51 -0700302 audio_config.decoder_factory = decoder_factory_;
kwiberga1ab8ba2017-03-29 04:06:05 -0700303 audio_config.decoder_map = {{120, {"opus", 48000, 2}}};
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100304 audio_receive_configs_.push_back(audio_config);
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000305 }
brandtr841de6a2016-11-15 07:10:52 -0800306
307 // TODO(brandtr): Update this when we support multistream protection.
308 RTC_DCHECK(num_flexfec_streams_ <= 1);
309 if (num_flexfec_streams_ == 1) {
brandtr8313a6f2017-01-13 07:41:19 -0800310 FlexfecReceiveStream::Config config(rtcp_send_transport);
brandtr1cfbd602016-12-08 04:17:53 -0800311 config.payload_type = kFlexfecPayloadType;
312 config.remote_ssrc = kFlexfecSendSsrc;
313 config.protected_media_ssrcs = {kVideoSendSsrcs[0]};
brandtrfa5a3682017-01-17 01:33:54 -0800314 config.local_ssrc = kReceiverLocalVideoSsrc;
brandtrb29e6522016-12-21 06:37:18 -0800315 for (const RtpExtension& extension : video_send_config_.rtp.extensions)
316 config.rtp_header_extensions.push_back(extension);
brandtr1cfbd602016-12-08 04:17:53 -0800317 flexfec_receive_configs_.push_back(config);
brandtr841de6a2016-11-15 07:10:52 -0800318 }
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000319}
320
danilchap9c6a0c72016-02-10 10:54:47 -0800321void CallTest::CreateFrameGeneratorCapturerWithDrift(Clock* clock,
perkjfa10b552016-10-02 23:45:26 -0700322 float speed,
323 int framerate,
324 int width,
325 int height) {
danilchap9c6a0c72016-02-10 10:54:47 -0800326 frame_generator_capturer_.reset(test::FrameGeneratorCapturer::Create(
perkjfa10b552016-10-02 23:45:26 -0700327 width, height, framerate * speed, clock));
perkj803d97f2016-11-01 11:45:46 -0700328 video_send_stream_->SetSource(
329 frame_generator_capturer_.get(),
sprangc5d62e22017-04-02 23:53:04 -0700330 VideoSendStream::DegradationPreference::kMaintainFramerate);
danilchap9c6a0c72016-02-10 10:54:47 -0800331}
332
perkjfa10b552016-10-02 23:45:26 -0700333void CallTest::CreateFrameGeneratorCapturer(int framerate,
334 int width,
335 int height) {
336 frame_generator_capturer_.reset(
337 test::FrameGeneratorCapturer::Create(width, height, framerate, clock_));
perkj803d97f2016-11-01 11:45:46 -0700338 video_send_stream_->SetSource(
339 frame_generator_capturer_.get(),
sprangc5d62e22017-04-02 23:53:04 -0700340 VideoSendStream::DegradationPreference::kMaintainFramerate);
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000341}
pbosf1828e82015-07-28 08:20:59 -0700342
oprypin92220ff2017-03-23 03:40:03 -0700343void CallTest::CreateFakeAudioDevices(
344 std::unique_ptr<FakeAudioDevice::Capturer> capturer,
345 std::unique_ptr<FakeAudioDevice::Renderer> renderer) {
oprypina5145842017-03-14 09:01:47 -0700346 fake_send_audio_device_.reset(new FakeAudioDevice(
oprypin92220ff2017-03-23 03:40:03 -0700347 std::move(capturer), nullptr, 1.f));
oprypina5145842017-03-14 09:01:47 -0700348 fake_recv_audio_device_.reset(new FakeAudioDevice(
oprypin92220ff2017-03-23 03:40:03 -0700349 nullptr, std::move(renderer), 1.f));
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100350}
351
352void CallTest::CreateVideoStreams() {
353 RTC_DCHECK(video_send_stream_ == nullptr);
354 RTC_DCHECK(video_receive_streams_.empty());
355 RTC_DCHECK(audio_send_stream_ == nullptr);
356 RTC_DCHECK(audio_receive_streams_.empty());
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000357
stefanff483612015-12-21 03:14:00 -0800358 video_send_stream_ = sender_call_->CreateVideoSendStream(
perkj26091b12016-09-01 01:17:40 -0700359 video_send_config_.Copy(), video_encoder_config_.Copy());
stefanff483612015-12-21 03:14:00 -0800360 for (size_t i = 0; i < video_receive_configs_.size(); ++i) {
Tommi733b5472016-06-10 17:58:01 +0200361 video_receive_streams_.push_back(receiver_call_->CreateVideoReceiveStream(
362 video_receive_configs_[i].Copy()));
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000363 }
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000364}
365
Perba7dc722016-04-19 15:01:23 +0200366void CallTest::SetFakeVideoCaptureRotation(VideoRotation rotation) {
367 frame_generator_capturer_->SetFakeRotation(rotation);
368}
369
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100370void CallTest::CreateAudioStreams() {
371 audio_send_stream_ = sender_call_->CreateAudioSendStream(audio_send_config_);
372 for (size_t i = 0; i < audio_receive_configs_.size(); ++i) {
373 audio_receive_streams_.push_back(
374 receiver_call_->CreateAudioReceiveStream(audio_receive_configs_[i]));
375 }
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100376}
377
brandtr841de6a2016-11-15 07:10:52 -0800378void CallTest::CreateFlexfecStreams() {
379 for (size_t i = 0; i < flexfec_receive_configs_.size(); ++i) {
380 flexfec_receive_streams_.push_back(
381 receiver_call_->CreateFlexfecReceiveStream(
382 flexfec_receive_configs_[i]));
383 }
384}
385
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000386void CallTest::DestroyStreams() {
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100387 if (audio_send_stream_)
388 sender_call_->DestroyAudioSendStream(audio_send_stream_);
389 audio_send_stream_ = nullptr;
390 for (AudioReceiveStream* audio_recv_stream : audio_receive_streams_)
391 receiver_call_->DestroyAudioReceiveStream(audio_recv_stream);
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100392
brandtrfb45c6c2017-01-27 06:47:55 -0800393 if (video_send_stream_)
394 sender_call_->DestroyVideoSendStream(video_send_stream_);
395 video_send_stream_ = nullptr;
ilnika014cc52017-03-07 04:21:04 -0800396
brandtrfb45c6c2017-01-27 06:47:55 -0800397 for (VideoReceiveStream* video_recv_stream : video_receive_streams_)
398 receiver_call_->DestroyVideoReceiveStream(video_recv_stream);
399
brandtr841de6a2016-11-15 07:10:52 -0800400 for (FlexfecReceiveStream* flexfec_recv_stream : flexfec_receive_streams_)
401 receiver_call_->DestroyFlexfecReceiveStream(flexfec_recv_stream);
402
403 video_receive_streams_.clear();
pbos@webrtc.org776e6f22014-10-29 15:28:39 +0000404 allocated_decoders_.clear();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000405}
406
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100407void CallTest::CreateVoiceEngines() {
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100408 voe_send_.voice_engine = VoiceEngine::Create();
409 voe_send_.base = VoEBase::GetInterface(voe_send_.voice_engine);
ossu29b1a8d2016-06-13 07:34:51 -0700410 EXPECT_EQ(0, voe_send_.base->Init(fake_send_audio_device_.get(), nullptr,
411 decoder_factory_));
solenberg88499ec2016-09-07 07:34:41 -0700412 VoEBase::ChannelConfig config;
413 config.enable_voice_pacing = true;
414 voe_send_.channel_id = voe_send_.base->CreateChannel(config);
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100415 EXPECT_GE(voe_send_.channel_id, 0);
416
417 voe_recv_.voice_engine = VoiceEngine::Create();
418 voe_recv_.base = VoEBase::GetInterface(voe_recv_.voice_engine);
ossu29b1a8d2016-06-13 07:34:51 -0700419 EXPECT_EQ(0, voe_recv_.base->Init(fake_recv_audio_device_.get(), nullptr,
420 decoder_factory_));
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100421 voe_recv_.channel_id = voe_recv_.base->CreateChannel();
422 EXPECT_GE(voe_recv_.channel_id, 0);
423}
424
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100425void CallTest::DestroyVoiceEngines() {
426 voe_recv_.base->DeleteChannel(voe_recv_.channel_id);
427 voe_recv_.channel_id = -1;
428 voe_recv_.base->Release();
429 voe_recv_.base = nullptr;
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100430
431 voe_send_.base->DeleteChannel(voe_send_.channel_id);
432 voe_send_.channel_id = -1;
433 voe_send_.base->Release();
434 voe_send_.base = nullptr;
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100435
436 VoiceEngine::Delete(voe_send_.voice_engine);
437 voe_send_.voice_engine = nullptr;
438 VoiceEngine::Delete(voe_recv_.voice_engine);
439 voe_recv_.voice_engine = nullptr;
440}
441
perkjfa10b552016-10-02 23:45:26 -0700442const int CallTest::kDefaultWidth;
443const int CallTest::kDefaultHeight;
444const int CallTest::kDefaultFramerate;
Peter Boström5811a392015-12-10 13:02:50 +0100445const int CallTest::kDefaultTimeoutMs = 30 * 1000;
446const int CallTest::kLongTimeoutMs = 120 * 1000;
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100447const uint8_t CallTest::kVideoSendPayloadType = 100;
448const uint8_t CallTest::kFakeVideoSendPayloadType = 125;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000449const uint8_t CallTest::kSendRtxPayloadType = 98;
stefan@webrtc.org01581da2014-09-04 06:48:14 +0000450const uint8_t CallTest::kRedPayloadType = 118;
Shao Changbine62202f2015-04-21 20:24:50 +0800451const uint8_t CallTest::kRtxRedPayloadType = 99;
stefan@webrtc.org01581da2014-09-04 06:48:14 +0000452const uint8_t CallTest::kUlpfecPayloadType = 119;
brandtr841de6a2016-11-15 07:10:52 -0800453const uint8_t CallTest::kFlexfecPayloadType = 120;
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100454const uint8_t CallTest::kAudioSendPayloadType = 103;
pbos@webrtc.org2bb1bda2014-07-07 13:06:48 +0000455const uint32_t CallTest::kSendRtxSsrcs[kNumSsrcs] = {0xBADCAFD, 0xBADCAFE,
456 0xBADCAFF};
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100457const uint32_t CallTest::kVideoSendSsrcs[kNumSsrcs] = {0xC0FFED, 0xC0FFEE,
458 0xC0FFEF};
459const uint32_t CallTest::kAudioSendSsrc = 0xDEADBEEF;
brandtr841de6a2016-11-15 07:10:52 -0800460const uint32_t CallTest::kFlexfecSendSsrc = 0xBADBEEF;
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100461const uint32_t CallTest::kReceiverLocalVideoSsrc = 0x123456;
462const uint32_t CallTest::kReceiverLocalAudioSsrc = 0x1234567;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000463const int CallTest::kNackRtpHistoryMs = 1000;
464
philipel4fb651d2017-04-10 03:54:05 -0700465BaseTest::BaseTest() : event_log_(RtcEventLog::CreateNull()) {}
philipele828c962017-03-21 03:24:27 -0700466
philipel4fb651d2017-04-10 03:54:05 -0700467BaseTest::BaseTest(unsigned int timeout_ms)
468 : RtpRtcpObserver(timeout_ms), event_log_(RtcEventLog::CreateNull()) {}
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000469
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000470BaseTest::~BaseTest() {
471}
472
oprypin92220ff2017-03-23 03:40:03 -0700473std::unique_ptr<FakeAudioDevice::Capturer> BaseTest::CreateCapturer() {
474 return FakeAudioDevice::CreatePulsedNoiseCapturer(256, 48000);
475}
476
477std::unique_ptr<FakeAudioDevice::Renderer> BaseTest::CreateRenderer() {
478 return FakeAudioDevice::CreateDiscardRenderer(48000);
479}
480
481void BaseTest::OnFakeAudioDevicesCreated(FakeAudioDevice* send_audio_device,
482 FakeAudioDevice* recv_audio_device) {
483}
484
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000485Call::Config BaseTest::GetSenderCallConfig() {
philipel4fb651d2017-04-10 03:54:05 -0700486 return Call::Config(event_log_.get());
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000487}
488
489Call::Config BaseTest::GetReceiverCallConfig() {
philipel4fb651d2017-04-10 03:54:05 -0700490 return Call::Config(event_log_.get());
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000491}
492
493void BaseTest::OnCallsCreated(Call* sender_call, Call* receiver_call) {
494}
495
nissed8ce1e12017-04-05 00:33:40 -0700496MediaType BaseTest::SelectMediaType() {
497 if (GetNumVideoStreams() > 0) {
498 if (GetNumAudioStreams() > 0) {
499 // Relies on PayloadDemuxer to set media type from payload type.
500 return MediaType::ANY;
501 } else {
502 return MediaType::VIDEO;
503 }
504 } else {
505 return MediaType::AUDIO;
506 }
507}
508
stefane74eef12016-01-08 06:47:13 -0800509test::PacketTransport* BaseTest::CreateSendTransport(Call* sender_call) {
510 return new PacketTransport(sender_call, this, test::PacketTransport::kSender,
nissed8ce1e12017-04-05 00:33:40 -0700511 SelectMediaType(),
stefane74eef12016-01-08 06:47:13 -0800512 FakeNetworkPipe::Config());
513}
514
515test::PacketTransport* BaseTest::CreateReceiveTransport() {
516 return new PacketTransport(nullptr, this, test::PacketTransport::kReceiver,
nissed8ce1e12017-04-05 00:33:40 -0700517 SelectMediaType(),
stefane74eef12016-01-08 06:47:13 -0800518 FakeNetworkPipe::Config());
519}
stefanf116bd02015-10-27 08:29:42 -0700520
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100521size_t BaseTest::GetNumVideoStreams() const {
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000522 return 1;
523}
524
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100525size_t BaseTest::GetNumAudioStreams() const {
526 return 0;
527}
528
brandtr841de6a2016-11-15 07:10:52 -0800529size_t BaseTest::GetNumFlexfecStreams() const {
530 return 0;
531}
532
stefanff483612015-12-21 03:14:00 -0800533void BaseTest::ModifyVideoConfigs(
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000534 VideoSendStream::Config* send_config,
535 std::vector<VideoReceiveStream::Config>* receive_configs,
stefanff483612015-12-21 03:14:00 -0800536 VideoEncoderConfig* encoder_config) {}
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000537
perkjfa10b552016-10-02 23:45:26 -0700538void BaseTest::ModifyVideoCaptureStartResolution(int* width,
539 int* heigt,
540 int* frame_rate) {}
541
stefanff483612015-12-21 03:14:00 -0800542void BaseTest::OnVideoStreamsCreated(
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000543 VideoSendStream* send_stream,
stefanff483612015-12-21 03:14:00 -0800544 const std::vector<VideoReceiveStream*>& receive_streams) {}
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000545
Stefan Holmer9fea80f2016-01-07 17:43:18 +0100546void BaseTest::ModifyAudioConfigs(
547 AudioSendStream::Config* send_config,
548 std::vector<AudioReceiveStream::Config>* receive_configs) {}
549
550void BaseTest::OnAudioStreamsCreated(
551 AudioSendStream* send_stream,
552 const std::vector<AudioReceiveStream*>& receive_streams) {}
553
brandtr841de6a2016-11-15 07:10:52 -0800554void BaseTest::ModifyFlexfecConfigs(
555 std::vector<FlexfecReceiveStream::Config>* receive_configs) {}
556
557void BaseTest::OnFlexfecStreamsCreated(
558 const std::vector<FlexfecReceiveStream*>& receive_streams) {}
559
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000560void BaseTest::OnFrameGeneratorCapturerCreated(
561 FrameGeneratorCapturer* frame_generator_capturer) {
562}
563
oprypin92220ff2017-03-23 03:40:03 -0700564void BaseTest::OnTestFinished() {
565}
566
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000567SendTest::SendTest(unsigned int timeout_ms) : BaseTest(timeout_ms) {
568}
569
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000570bool SendTest::ShouldCreateReceivers() const {
571 return false;
572}
573
philipele828c962017-03-21 03:24:27 -0700574EndToEndTest::EndToEndTest() {}
575
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000576EndToEndTest::EndToEndTest(unsigned int timeout_ms) : BaseTest(timeout_ms) {
577}
578
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000579bool EndToEndTest::ShouldCreateReceivers() const {
580 return true;
581}
582
583} // namespace test
584} // namespace webrtc