blob: 8afcf25121b405a761a91abd9cf2957207d80800 [file] [log] [blame]
solenbergc7a8b082015-10-16 14:35:07 -07001/*
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Jonas Olssona4d87372019-07-05 19:08:33 +020011#include "call/call.h"
12
solenbergc7a8b082015-10-16 14:35:07 -070013#include <list>
kwiberg1c07c702017-03-27 07:15:49 -070014#include <map>
kwibergb25345e2016-03-12 06:10:44 -080015#include <memory>
zstein7cb69d52017-05-08 11:52:38 -070016#include <utility>
solenbergc7a8b082015-10-16 14:35:07 -070017
Karl Wiberg918f50c2018-07-05 11:40:33 +020018#include "absl/memory/memory.h"
Karl Wibergf3850f62017-11-02 13:04:41 +010019#include "api/audio_codecs/builtin_audio_decoder_factory.h"
Danil Chapovalov83bbe912019-08-07 12:24:53 +020020#include "api/rtc_event_log/rtc_event_log.h"
Danil Chapovalov53d45ba2019-07-03 14:56:33 +020021#include "api/task_queue/default_task_queue_factory.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020022#include "api/test/mock_audio_mixer.h"
Erik Språng014dd3c2019-11-28 13:44:25 +010023#include "api/transport/field_trial_based_config.h"
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010024#include "audio/audio_receive_stream.h"
Yves Gerey665174f2018-06-19 15:03:05 +020025#include "audio/audio_send_stream.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020026#include "call/audio_state.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020027#include "modules/audio_device/include/mock_audio_device.h"
Fredrik Solenberg2a877972017-12-15 16:42:15 +010028#include "modules/audio_processing/include/mock_audio_processing.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020029#include "modules/rtp_rtcp/include/rtp_rtcp.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020030#include "test/fake_encoder.h"
31#include "test/gtest.h"
32#include "test/mock_audio_decoder_factory.h"
33#include "test/mock_transport.h"
Tommi553c8692020-05-05 15:35:45 +020034#include "test/run_loop.h"
solenbergc7a8b082015-10-16 14:35:07 -070035
36namespace {
37
38struct CallHelper {
Per Åhgrencc73ed32020-04-26 23:56:17 +020039 explicit CallHelper(bool use_null_audio_processing) {
Danil Chapovalov53d45ba2019-07-03 14:56:33 +020040 task_queue_factory_ = webrtc::CreateDefaultTaskQueueFactory();
solenberg566ef242015-11-06 15:34:49 -080041 webrtc::AudioState::Config audio_state_config;
Fredrik Solenberg2a877972017-12-15 16:42:15 +010042 audio_state_config.audio_mixer =
43 new rtc::RefCountedObject<webrtc::test::MockAudioMixer>();
44 audio_state_config.audio_processing =
Per Åhgrencc73ed32020-04-26 23:56:17 +020045 use_null_audio_processing
46 ? nullptr
47 : new rtc::RefCountedObject<webrtc::test::MockAudioProcessing>();
Fredrik Solenberg2a877972017-12-15 16:42:15 +010048 audio_state_config.audio_device_module =
49 new rtc::RefCountedObject<webrtc::test::MockAudioDeviceModule>();
skvlad11a9cbf2016-10-07 11:53:05 -070050 webrtc::Call::Config config(&event_log_);
solenberg566ef242015-11-06 15:34:49 -080051 config.audio_state = webrtc::AudioState::Create(audio_state_config);
Danil Chapovalov53d45ba2019-07-03 14:56:33 +020052 config.task_queue_factory = task_queue_factory_.get();
Erik Språng014dd3c2019-11-28 13:44:25 +010053 config.trials = &field_trials_;
solenbergc7a8b082015-10-16 14:35:07 -070054 call_.reset(webrtc::Call::Create(config));
55 }
56
57 webrtc::Call* operator->() { return call_.get(); }
58
59 private:
Tommi553c8692020-05-05 15:35:45 +020060 webrtc::test::RunLoop loop_;
Danil Chapovalov83bbe912019-08-07 12:24:53 +020061 webrtc::RtcEventLogNull event_log_;
Erik Språng014dd3c2019-11-28 13:44:25 +010062 webrtc::FieldTrialBasedConfig field_trials_;
Danil Chapovalov53d45ba2019-07-03 14:56:33 +020063 std::unique_ptr<webrtc::TaskQueueFactory> task_queue_factory_;
kwibergb25345e2016-03-12 06:10:44 -080064 std::unique_ptr<webrtc::Call> call_;
solenbergc7a8b082015-10-16 14:35:07 -070065};
66} // namespace
67
68namespace webrtc {
69
70TEST(CallTest, ConstructDestruct) {
Per Åhgrencc73ed32020-04-26 23:56:17 +020071 for (bool use_null_audio_processing : {false, true}) {
72 CallHelper call(use_null_audio_processing);
73 }
solenbergc7a8b082015-10-16 14:35:07 -070074}
75
76TEST(CallTest, CreateDestroy_AudioSendStream) {
Per Åhgrencc73ed32020-04-26 23:56:17 +020077 for (bool use_null_audio_processing : {false, true}) {
78 CallHelper call(use_null_audio_processing);
79 MockTransport send_transport;
80 AudioSendStream::Config config(&send_transport);
81 config.rtp.ssrc = 42;
82 AudioSendStream* stream = call->CreateAudioSendStream(config);
83 EXPECT_NE(stream, nullptr);
84 call->DestroyAudioSendStream(stream);
85 }
solenbergc7a8b082015-10-16 14:35:07 -070086}
87
88TEST(CallTest, CreateDestroy_AudioReceiveStream) {
Per Åhgrencc73ed32020-04-26 23:56:17 +020089 for (bool use_null_audio_processing : {false, true}) {
90 CallHelper call(use_null_audio_processing);
91 AudioReceiveStream::Config config;
92 MockTransport rtcp_send_transport;
93 config.rtp.remote_ssrc = 42;
94 config.rtcp_send_transport = &rtcp_send_transport;
95 config.decoder_factory =
96 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
97 AudioReceiveStream* stream = call->CreateAudioReceiveStream(config);
98 EXPECT_NE(stream, nullptr);
99 call->DestroyAudioReceiveStream(stream);
100 }
solenbergc7a8b082015-10-16 14:35:07 -0700101}
102
103TEST(CallTest, CreateDestroy_AudioSendStreams) {
Per Åhgrencc73ed32020-04-26 23:56:17 +0200104 for (bool use_null_audio_processing : {false, true}) {
105 CallHelper call(use_null_audio_processing);
106 MockTransport send_transport;
107 AudioSendStream::Config config(&send_transport);
108 std::list<AudioSendStream*> streams;
109 for (int i = 0; i < 2; ++i) {
110 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
111 config.rtp.ssrc = ssrc;
112 AudioSendStream* stream = call->CreateAudioSendStream(config);
113 EXPECT_NE(stream, nullptr);
114 if (ssrc & 1) {
115 streams.push_back(stream);
116 } else {
117 streams.push_front(stream);
118 }
solenbergc7a8b082015-10-16 14:35:07 -0700119 }
Per Åhgrencc73ed32020-04-26 23:56:17 +0200120 for (auto s : streams) {
121 call->DestroyAudioSendStream(s);
122 }
123 streams.clear();
solenbergc7a8b082015-10-16 14:35:07 -0700124 }
solenbergc7a8b082015-10-16 14:35:07 -0700125 }
126}
127
128TEST(CallTest, CreateDestroy_AudioReceiveStreams) {
Per Åhgrencc73ed32020-04-26 23:56:17 +0200129 for (bool use_null_audio_processing : {false, true}) {
130 CallHelper call(use_null_audio_processing);
131 AudioReceiveStream::Config config;
132 MockTransport rtcp_send_transport;
133 config.rtcp_send_transport = &rtcp_send_transport;
134 config.decoder_factory =
135 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
136 std::list<AudioReceiveStream*> streams;
137 for (int i = 0; i < 2; ++i) {
138 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
139 config.rtp.remote_ssrc = ssrc;
140 AudioReceiveStream* stream = call->CreateAudioReceiveStream(config);
141 EXPECT_NE(stream, nullptr);
142 if (ssrc & 1) {
143 streams.push_back(stream);
144 } else {
145 streams.push_front(stream);
146 }
solenbergc7a8b082015-10-16 14:35:07 -0700147 }
Per Åhgrencc73ed32020-04-26 23:56:17 +0200148 for (auto s : streams) {
149 call->DestroyAudioReceiveStream(s);
150 }
151 streams.clear();
solenbergc7a8b082015-10-16 14:35:07 -0700152 }
solenbergc7a8b082015-10-16 14:35:07 -0700153 }
154}
brandtr25445d32016-10-23 23:37:14 -0700155
solenberg7602aab2016-11-14 11:30:07 -0800156TEST(CallTest, CreateDestroy_AssociateAudioSendReceiveStreams_RecvFirst) {
Per Åhgrencc73ed32020-04-26 23:56:17 +0200157 for (bool use_null_audio_processing : {false, true}) {
158 CallHelper call(use_null_audio_processing);
159 AudioReceiveStream::Config recv_config;
160 MockTransport rtcp_send_transport;
161 recv_config.rtp.remote_ssrc = 42;
162 recv_config.rtp.local_ssrc = 777;
163 recv_config.rtcp_send_transport = &rtcp_send_transport;
164 recv_config.decoder_factory =
165 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
166 AudioReceiveStream* recv_stream =
167 call->CreateAudioReceiveStream(recv_config);
168 EXPECT_NE(recv_stream, nullptr);
solenberg7602aab2016-11-14 11:30:07 -0800169
Per Åhgrencc73ed32020-04-26 23:56:17 +0200170 MockTransport send_transport;
171 AudioSendStream::Config send_config(&send_transport);
172 send_config.rtp.ssrc = 777;
173 AudioSendStream* send_stream = call->CreateAudioSendStream(send_config);
174 EXPECT_NE(send_stream, nullptr);
solenberg7602aab2016-11-14 11:30:07 -0800175
Per Åhgrencc73ed32020-04-26 23:56:17 +0200176 internal::AudioReceiveStream* internal_recv_stream =
177 static_cast<internal::AudioReceiveStream*>(recv_stream);
178 EXPECT_EQ(send_stream,
179 internal_recv_stream->GetAssociatedSendStreamForTesting());
solenberg7602aab2016-11-14 11:30:07 -0800180
Per Åhgrencc73ed32020-04-26 23:56:17 +0200181 call->DestroyAudioSendStream(send_stream);
182 EXPECT_EQ(nullptr,
183 internal_recv_stream->GetAssociatedSendStreamForTesting());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100184
Per Åhgrencc73ed32020-04-26 23:56:17 +0200185 call->DestroyAudioReceiveStream(recv_stream);
186 }
solenberg7602aab2016-11-14 11:30:07 -0800187}
188
189TEST(CallTest, CreateDestroy_AssociateAudioSendReceiveStreams_SendFirst) {
Per Åhgrencc73ed32020-04-26 23:56:17 +0200190 for (bool use_null_audio_processing : {false, true}) {
191 CallHelper call(use_null_audio_processing);
192 MockTransport send_transport;
193 AudioSendStream::Config send_config(&send_transport);
194 send_config.rtp.ssrc = 777;
195 AudioSendStream* send_stream = call->CreateAudioSendStream(send_config);
196 EXPECT_NE(send_stream, nullptr);
solenberg7602aab2016-11-14 11:30:07 -0800197
Per Åhgrencc73ed32020-04-26 23:56:17 +0200198 AudioReceiveStream::Config recv_config;
199 MockTransport rtcp_send_transport;
200 recv_config.rtp.remote_ssrc = 42;
201 recv_config.rtp.local_ssrc = 777;
202 recv_config.rtcp_send_transport = &rtcp_send_transport;
203 recv_config.decoder_factory =
204 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
205 AudioReceiveStream* recv_stream =
206 call->CreateAudioReceiveStream(recv_config);
207 EXPECT_NE(recv_stream, nullptr);
solenberg7602aab2016-11-14 11:30:07 -0800208
Per Åhgrencc73ed32020-04-26 23:56:17 +0200209 internal::AudioReceiveStream* internal_recv_stream =
210 static_cast<internal::AudioReceiveStream*>(recv_stream);
211 EXPECT_EQ(send_stream,
212 internal_recv_stream->GetAssociatedSendStreamForTesting());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100213
Per Åhgrencc73ed32020-04-26 23:56:17 +0200214 call->DestroyAudioReceiveStream(recv_stream);
solenberg7602aab2016-11-14 11:30:07 -0800215
Per Åhgrencc73ed32020-04-26 23:56:17 +0200216 call->DestroyAudioSendStream(send_stream);
217 }
solenberg7602aab2016-11-14 11:30:07 -0800218}
219
brandtr25445d32016-10-23 23:37:14 -0700220TEST(CallTest, CreateDestroy_FlexfecReceiveStream) {
Per Åhgrencc73ed32020-04-26 23:56:17 +0200221 for (bool use_null_audio_processing : {false, true}) {
222 CallHelper call(use_null_audio_processing);
223 MockTransport rtcp_send_transport;
224 FlexfecReceiveStream::Config config(&rtcp_send_transport);
225 config.payload_type = 118;
226 config.remote_ssrc = 38837212;
227 config.protected_media_ssrcs = {27273};
brandtr25445d32016-10-23 23:37:14 -0700228
Per Åhgrencc73ed32020-04-26 23:56:17 +0200229 FlexfecReceiveStream* stream = call->CreateFlexfecReceiveStream(config);
230 EXPECT_NE(stream, nullptr);
231 call->DestroyFlexfecReceiveStream(stream);
232 }
brandtr25445d32016-10-23 23:37:14 -0700233}
234
235TEST(CallTest, CreateDestroy_FlexfecReceiveStreams) {
Per Åhgrencc73ed32020-04-26 23:56:17 +0200236 for (bool use_null_audio_processing : {false, true}) {
237 CallHelper call(use_null_audio_processing);
238 MockTransport rtcp_send_transport;
239 FlexfecReceiveStream::Config config(&rtcp_send_transport);
240 config.payload_type = 118;
241 std::list<FlexfecReceiveStream*> streams;
brandtr25445d32016-10-23 23:37:14 -0700242
Per Åhgrencc73ed32020-04-26 23:56:17 +0200243 for (int i = 0; i < 2; ++i) {
244 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
245 config.remote_ssrc = ssrc;
246 config.protected_media_ssrcs = {ssrc + 1};
247 FlexfecReceiveStream* stream = call->CreateFlexfecReceiveStream(config);
248 EXPECT_NE(stream, nullptr);
249 if (ssrc & 1) {
250 streams.push_back(stream);
251 } else {
252 streams.push_front(stream);
253 }
brandtr25445d32016-10-23 23:37:14 -0700254 }
Per Åhgrencc73ed32020-04-26 23:56:17 +0200255 for (auto s : streams) {
256 call->DestroyFlexfecReceiveStream(s);
257 }
258 streams.clear();
brandtr25445d32016-10-23 23:37:14 -0700259 }
brandtr25445d32016-10-23 23:37:14 -0700260 }
261}
262
263TEST(CallTest, MultipleFlexfecReceiveStreamsProtectingSingleVideoStream) {
Per Åhgrencc73ed32020-04-26 23:56:17 +0200264 for (bool use_null_audio_processing : {false, true}) {
265 CallHelper call(use_null_audio_processing);
266 MockTransport rtcp_send_transport;
267 FlexfecReceiveStream::Config config(&rtcp_send_transport);
268 config.payload_type = 118;
269 config.protected_media_ssrcs = {1324234};
270 FlexfecReceiveStream* stream;
271 std::list<FlexfecReceiveStream*> streams;
brandtr25445d32016-10-23 23:37:14 -0700272
Per Åhgrencc73ed32020-04-26 23:56:17 +0200273 config.remote_ssrc = 838383;
274 stream = call->CreateFlexfecReceiveStream(config);
275 EXPECT_NE(stream, nullptr);
276 streams.push_back(stream);
brandtr25445d32016-10-23 23:37:14 -0700277
Per Åhgrencc73ed32020-04-26 23:56:17 +0200278 config.remote_ssrc = 424993;
279 stream = call->CreateFlexfecReceiveStream(config);
280 EXPECT_NE(stream, nullptr);
281 streams.push_back(stream);
brandtr25445d32016-10-23 23:37:14 -0700282
Per Åhgrencc73ed32020-04-26 23:56:17 +0200283 config.remote_ssrc = 99383;
284 stream = call->CreateFlexfecReceiveStream(config);
285 EXPECT_NE(stream, nullptr);
286 streams.push_back(stream);
brandtr25445d32016-10-23 23:37:14 -0700287
Per Åhgrencc73ed32020-04-26 23:56:17 +0200288 config.remote_ssrc = 5548;
289 stream = call->CreateFlexfecReceiveStream(config);
290 EXPECT_NE(stream, nullptr);
291 streams.push_back(stream);
brandtr25445d32016-10-23 23:37:14 -0700292
Per Åhgrencc73ed32020-04-26 23:56:17 +0200293 for (auto s : streams) {
294 call->DestroyFlexfecReceiveStream(s);
295 }
brandtr25445d32016-10-23 23:37:14 -0700296 }
297}
298
ossuc3d4b482017-05-23 06:07:11 -0700299TEST(CallTest, RecreatingAudioStreamWithSameSsrcReusesRtpState) {
300 constexpr uint32_t kSSRC = 12345;
Per Åhgrencc73ed32020-04-26 23:56:17 +0200301 for (bool use_null_audio_processing : {false, true}) {
302 CallHelper call(use_null_audio_processing);
ossuc3d4b482017-05-23 06:07:11 -0700303
Per Åhgrencc73ed32020-04-26 23:56:17 +0200304 auto create_stream_and_get_rtp_state = [&](uint32_t ssrc) {
305 MockTransport send_transport;
306 AudioSendStream::Config config(&send_transport);
307 config.rtp.ssrc = ssrc;
308 AudioSendStream* stream = call->CreateAudioSendStream(config);
309 const RtpState rtp_state =
310 static_cast<internal::AudioSendStream*>(stream)->GetRtpState();
311 call->DestroyAudioSendStream(stream);
312 return rtp_state;
313 };
ossuc3d4b482017-05-23 06:07:11 -0700314
Per Åhgrencc73ed32020-04-26 23:56:17 +0200315 const RtpState rtp_state1 = create_stream_and_get_rtp_state(kSSRC);
316 const RtpState rtp_state2 = create_stream_and_get_rtp_state(kSSRC);
ossuc3d4b482017-05-23 06:07:11 -0700317
Per Åhgrencc73ed32020-04-26 23:56:17 +0200318 EXPECT_EQ(rtp_state1.sequence_number, rtp_state2.sequence_number);
319 EXPECT_EQ(rtp_state1.start_timestamp, rtp_state2.start_timestamp);
320 EXPECT_EQ(rtp_state1.timestamp, rtp_state2.timestamp);
321 EXPECT_EQ(rtp_state1.capture_time_ms, rtp_state2.capture_time_ms);
322 EXPECT_EQ(rtp_state1.last_timestamp_time_ms,
323 rtp_state2.last_timestamp_time_ms);
324 EXPECT_EQ(rtp_state1.media_has_been_sent, rtp_state2.media_has_been_sent);
325 }
ossuc3d4b482017-05-23 06:07:11 -0700326}
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100327
solenbergc7a8b082015-10-16 14:35:07 -0700328} // namespace webrtc